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是我之前学习过的,所以也比较熟悉,总之,这是一次愉快的实验。

原文地址:https://www.cnblogs.com/ambition-hhn/p/12907530.html