2020系统综合实践 第5次实践作业
构建所需的镜像
- 参考博客:
- 首先我们要准备所需要的python镜像,因为用到了数据库操作和opencv,所以需要安装一些额外的库,dockerfile中的指令里我使用了临时换源的方法,因为我尝试了直接更换容器内的pip配置,但是没什么效果,在指令里直接加入国内源也可以起到换源下载的效果。
//Dockerfile
#基础镜像
FROM python
#默认工作目录
WORKDIR /usr/local/pyfile
#安装所需要的库,后面-i 就是换成国内的源去安装所需要的库,因为一开始我试了换pip的配置文件,但是没什么效果,所以就在安装的指令里临时这样用。
RUN pip install PyMySQL -i https://pypi.tuna.tsinghua.edu.cn/simple && pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
- 这样,所需要的基本镜像准备完毕,接下来就可以一项一项编写程序测试了。
程序部署
-
参考资料老师在作业发布界面给出的链接。
-
首先需要跑起来一个mysql的容器,以方便测试,可以使用之前实验中的容器。
-
接下来运行一个刚才定制的python容器,并且进入交互模式。
-
具体参数可参考该资料------Docker run 命令
#--link是连接容器,-v是挂载,-it是交互使用
sudo docker run -it -v /home/hhn/homework5/pyfile:/usr/local/pyfile --link=mymysql:mymysql -d mypython
- 用ls命令可以看到容器内当前目录下已经有我们需要的全部py程序,可以开始测试。
helloworld
- 这是最基本的一个程序,基本上是每个学习python的人完成的第一个程序,代码也只有短短一行。
print("Hello World")
日历
- 这是一个交互式的程序,输入年份和月份后会返回当前月份的日历。
import calendar
yy = int(input("输入年份: "))
mm = int(input("输入月份: "))
print(calendar.month(yy,mm))
数据库操作
- 整个过程是创建一个STUDENT表,然后插入数据,进行查询,之后进行修改数据和删除数据,再进行查询。连接的时候host值填数据库容器的名称,我填localhost无法连接,会出现错误。
import pymysql
# 打开数据库连接
db = pymysql.connect(host="mymysql",user="root",passwd="123456",db="docker_mysql",port=3306)
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL 查询
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
print ("Database version : %s " % data)
# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS STUDENT")
# 使用预处理语句创建表
sql = """CREATE TABLE STUDENT (
ID CHAR(20) NOT NULL,
NAME CHAR(20) NOT NULL,
AGE INT,
SEX CHAR(10),
MAJOR CHAR(30) )"""
cursor.execute(sql)
# SQL 插入语句
sql = """INSERT INTO STUDENT(ID,
NAME, AGE, SEX, MAJOR)
VALUES ('111700312', 'hhn', 20, 'Male', 'computer science')"""
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 如果发生错误则回滚
db.rollback()
sql = """INSERT INTO STUDENT(ID,
NAME, AGE, SEX, MAJOR)
VALUES ('123456789', 'test', 18, 'Female', 'English')"""
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 如果发生错误则回滚
db.rollback()
# SQL 查询语句
sql = "SELECT * FROM STUDENT \
WHERE AGE >= 18"
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
for row in results:
ID = row[0]
NAME = row[1]
AGE = row[2]
SEX = row[3]
MAJOR = row[4]
# 打印结果
print ("id=%s,name=%s,age=%s,sex=%s,major=%s" % \
(ID, NAME, AGE, SEX, MAJOR ))
except:
print ("Error: unable to fetch data")
# SQL 更新语句
sql = "UPDATE STUDENT SET AGE = AGE + 1 WHERE SEX = '%s'" % ('Male')
try:
# 执行SQL语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 发生错误时回滚
db.rollback()
# SQL 查询语句
sql = "SELECT * FROM STUDENT \
WHERE AGE >= 18"
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
for row in results:
ID = row[0]
NAME = row[1]
AGE = row[2]
SEX = row[3]
MAJOR = row[4]
# 打印结果
print ("id=%s,name=%s,age=%s,sex=%s,major=%s" % \
(ID, NAME, AGE, SEX, MAJOR ))
except:
print ("Error: unable to fetch data")
# SQL 删除语句
sql = "DELETE FROM STUDENT WHERE AGE >= %s" % (20)
try:
# 执行SQL语句
cursor.execute(sql)
# 提交修改
db.commit()
except:
# 发生错误时回滚
db.rollback()
# SQL 查询语句
sql = "SELECT * FROM STUDENT \
WHERE AGE >= 18"
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
for row in results:
ID = row[0]
NAME = row[1]
AGE = row[2]
SEX = row[3]
MAJOR = row[4]
# 打印结果
print ("id=%s,name=%s,age=%s,sex=%s,major=%s" % \
(ID, NAME, AGE, SEX, MAJOR ))
except:
print ("Error: unable to fetch data")
# 关闭数据库连接
db.close()
- 进入数据库的容器确认,如图,和预期结果相符,容器内有STUDENT表,并且最后只剩下一条数据。
opencv操作
- 参考资料------(Canny边缘检测)[https://www.cnblogs.com/aoru45/p/9763988.html]
- 这个我选的操作是边缘检测,刚好大数据学习过相关的内容,就试一试效果,python程序很简单,就是调一个库就可以了,但是背后实现并不简单。
import cv2
img = cv2.imread('test.jpg',0)
#Canny的后两个参数可以根据图片自己调
edges = cv2.Canny(img,50,100)
cv2.imwrite('after.jpg',edges)
-
这是我选择的原图。
-
这是处理后的效果图,效果我觉得还是很不错的。
-
最后本次实验的文件结构
问题&解决方法
- Q:运行日历程序calendar.py程序报错。
- A:python库中有calendar的库,如果你自己的程序还是这样命名会冲突,所以换个名字就可以。
- Q:python的容器无法连接上数据库,显示Can't connect to MySQL server on 'localhost' ([Errno 99] Cannot assign requested address)
- A:run中的link参数已经把两个容器链接在一起,在操作数据库的python文件中连接操作时host使用localhost时一直连接不上时,可以试试换成数据库容器的名字,我是换成数据库容器的名字后就连接上了。
时间
实验+写博客约三小时。
小结
这个实验差不多算是做的最快的一个,因为有了前几次的经验,有些错误就可以很快地找到解决方法。而且现在下载软件我的第一反应不是怎么下载,而是如何去换源,换源后的速度真是起飞。而且这次实验用的python是我之前学习过的,所以也比较熟悉,总之,这是一次愉快的实验。