(第一次写的python为了实现某个临时的展示场景,有百度真好,0基础也不怕~)
python环境可以使用anaconda来管理
下面是windows下的一个图片展示的例子,图片从linux服务器上获取硬盘上读取,光盘中读取(当前系统-蓝光配置内部机制,当文件在光盘中时,硬盘中有映射图片,但要从光盘自动拷贝到本地才能真的读取到)
config.ini
[config_env]
#0:硬盘,1:光盘,
fileSource = 0
#图片循环执行次数
repeatTimes = 1
[config_diskFile]
#读缓存文件的配置
#放置图片的文件夹路径
samba_username = root
samba_pwd = 0p-0p-
#images2文件在读缓存中
fileLoad = //172.16.1.88/rdfs/ykx-test/imFolder1/
[config_remoteFile]
#读光盘文件的配置
remote_ip = 172.16.1.88
remote_username = root
remote_pwd = 0p-0p-
fileReadbuffer = /rdfs_cache/readbuffer/ykx-test/r/
deleteDir = imFolder2
samba_username = root
samba_pwd = 0p-0p-
#images文件在光盘中,没在读/写缓存中,如果在读缓存中,运行win_showCDRomImages.py时会将images从读缓存清理掉
fileLoad = //172.16.1.88/rdfs/ykx-test/imFolder2/
#将文件拷贝到本地目录
destLoad = E:/images
config.py
# coding=gbk
import configparser
import os
import sys
conf = configparser.ConfigParser()
# #程序运行目录
# exeruningpath=os.path.dirname(sys.executable)
# #源码工程的父目录,即readfiles的上一级目录
# exepath = os.path.dirname(sys.path[0])
# print("程序运行路径:" + exeruningpath)
# print("工程所在目录:" +exepath)
# print("当前工作目录:" +os.getcwd())
# if os.path.exists(exepath + "\\readImages\\config\\config.ini"):
# conf.read(exepath + "\\readImages\\config\\config.ini",encoding='UTF-8-sig')
# else:
# #将config.ini与打包出来的exe文件放在同个目录,打包命令:pyinstaller -F main.py
# conf.read(exeruningpath + "\\config.ini",encoding='UTF-8-sig')
#当前工作目录
cwd = os.getcwd()
print("当前工作目录:" + cwd)
#获取config.ini文件
if os.path.exists(cwd+ "\\config\\config.ini"):
conf.read(cwd+ "\\config\\config.ini",encoding='UTF-8-sig')
else:
#将config.ini与打包出来的exe文件放在同个目录,打包命令:pyinstaller -F main.py
conf.read(cwd+ "\\config.ini",encoding='UTF-8-sig')
# 调用get方法,然后获取配置的数据
fileSource = conf.get("config_env","fileSource")
repeatTimes = conf.get("config_env","repeatTimes")
#读硬盘
samba_username = conf.get("config_diskFile" , "samba_username")
samba_pwd = conf.get("config_diskFile", "samba_pwd")
fileLoad = conf.get("config_diskFile", "fileLoad")
#读光盘
remote_ip = conf.get("config_remoteFile", "remote_ip")
remote_username = conf.get("config_remoteFile", "remote_username")
remote_pwd = conf.get("config_remoteFile", "remote_pwd")
fileReadbuffer = conf.get("config_remoteFile", "fileReadbuffer")
deleteDir = conf.get("config_remoteFile", "deleteDir")
fileLoadCDSmaba = conf.get("config_remoteFile", "fileLoad")
fileUtil.py
# coding=gbk
import sys
print(sys.path.append('..'))
import os,shutil
#获取文件夹下的图片文件
def get_images_file_name(file_dir):
L = []
for root, dirs, files in os.walk(file_dir):
print("当前路径:" + root) # 当前目录路径
print("当前路径下所有子目录:")
print(dirs) # 当前路径下所有子目录
print("当前路径下所有非目录子文件:")
print(files) # 当前路径下所有非目录子文件
for file in files:
if os.path.splitext(file)[1] == '.jpeg':
L.append(os.path.join(root, file))
if os.path.splitext(file)[1] == '.jpg':
L.append(os.path.join(root, file))
if os.path.splitext(file)[1] == '.png':
L.append(os.path.join(root, file))
print("前路径下所有非目录子文件完整目录:")
print(L) # 当前路径下所有图片
return L
#获取文件夹下的所有文件
def get_all_file_name(file_dir):
L = []
for root, dirs, files in os.walk(file_dir):
print("当前路径:" + root) # 当前目录路径
print("当前路径下所有子目录:")
print(dirs) # 当前路径下所有子目录
print("当前路径下所有非目录子文件:")
print(files) # 当前路径下所有非目录子文件
for file in files:
L.append(os.path.join(root, file))
print("前路径下所有非目录子文件完整目录:")
print(L) # 当前路径下所有非目录子文件
return L
def deleteFile(file_dir):
print("删除目录" + file_dir)
def mycopyfile(srcfile,dstfile):
if not os.path.isfile(srcfile):
print("%s not exist!"%(srcfile))
else:
fpath,fname=os.path.split(dstfile) #分离文件名和路径
if not os.path.exists(fpath):
os.makedirs(fpath) #创建路径
shutil.copyfile(srcfile,dstfile) #复制文件
print("copy %s -> %s"%( srcfile,dstfile))
win_showCDRomImages.py
# coding=gbk
import sys
sys.path.append('..')
import os
import time
import datetime
import cv2
import paramiko
from config import config
from fileManager import fileUtil
def readFile():
try:
# 创建SSHClient实例对象
ssh = paramiko.SSHClient()
# 调用方法,标识没有远程机器的公钥,允许访问
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接远程机器 地址端口用户名密码
ssh.connect(config.remote_ip,22,config.remote_username,config.remote_pwd)
#ssh.connect("172.16.1.88", 22, "root", "0p-0p-")
#切换到目录
#cmd = "cd " + config.fileReadbuffer +";rm -rf " + config.deleteDir
cmd = "rm -rf " + config.fileReadbuffer + config.deleteDir
stdin,stdout,stderr = ssh.exec_command(cmd)
print(stdout.read().decode("utf-8"))
time.sleep(1)
#从文件夹获取文件
filepath = config.fileLoadCDSmaba
files = []
files = fileUtil.get_images_file_name(filepath)
i = int(1)
for file in files:
#依次读取展示图片
bool = True
image = None
image = cv2.imread(file)
try:
if image == None:
while True:
time.sleep(0.2)
cmd = "find " + config.fileReadbuffer + config.deleteDir + " -name " + os.path.basename(file) + "*"
stdin, stdout, stderr = ssh.exec_command(cmd)
findfile = stdout.read().decode("utf-8")
if findfile != '':
print(findfile)
image = cv2.imread(file)
break
except Exception as e:
print("读文件异常:" + str(e))
nowTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 现在
print("当前时间戳:" + nowTime)
print("光盘读取第" + str(i) + "张图片")
#获取图片尺寸
#x, y = image.shape[0:2]
#图片尺寸缩小至1/2
#im = cv2.resize(image, (int(y / 2), int(x / 2)))
#cv2.namedWindow("CD", 0)
#cv2.moveWindow("CD", 10, 10)
cv2.imshow("CD", image)
cv2.waitKey(1000)
i = i + 1
except Exception as e:
print( "error info : " + str(e))
finally:
print("最后执行关闭连接")
# 关闭连接
ssh.close()
win_showHardDiskImages.py
# coding=gbk
import sys
sys.path.append('..')
import datetime
import cv2
from fileManager import fileUtil
from config import config
def readFile():
filepath = config.fileLoad
files = []
files = fileUtil.get_images_file_name(filepath)
i = int(1)
for file in files:
#依次读取展示图片
try:
image = cv2.imread(file)
#x, y = image.shape[0:2]
#im = cv2.resize(image, (int(y / 2), int(x / 2)))
#cv2.namedWindow("HD", 0)
#cv2.moveWindow("HD", 50, 10)
nowTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 现在
print("当前时间戳:" + nowTime)
print("硬盘读取第" + str(i) + "张图片")
cv2.imshow("HD", image)
cv2.waitKey(1000)
i = i+ 1
except Exception as e:
print( "error info : " + e)
main.py
from config import config
from fileManager import win_showHardDiskImages as showHardDiskImages
from fileManager import win_showCDRomImages as showCDRomImages
import _thread
fileSource = config.fileSource
if __name__ == "__main__":
if fileSource == '0' :
for i in range(0, int (config.repeatTimes)):
print("开始第" + str(i+1) + "轮")
showHardDiskImages.readFile()
elif fileSource == '1' :
for i in range(0,int (config.repeatTimes)):
print("开始第" + str(i+1) + "轮")
showCDRomImages.readFile()
else:
print("请检查配置文件中的'fileSource'设置")
README.md
win10 64位下运行,依赖环境:
通过anaconda安装
python版本V3.6.8
py-opencv 3.4.2(安装此依赖时会自动选择将libopencv 3.4.2也安装了)
paramiko 2.4.2 (远程访问操作)
删除cryptography 2.7(paramiko安装时自动安装的依赖) 改为安装cryptography 2.4.2
configparser(读配置文件)
pyinstaller 3.4(打包工具)