监控添加的 .jpg 文件夹,使用 CUPS 自动打印,将相同的 .jpg 移动到另一个文件夹
Monitor a folder for .jpg added, autoprint using CUPS, move same .jpg to another folder
我正在尝试使用 Python 2.7 在我的 Raspberry Pi 3B 上创建自动明信片打印脚本。我希望脚本在后台不断 运行 检查放入文件夹中的任何新 .jpg 文件,使用 CUPS/pycups 自动打印放入文件夹中的所有 .jpg 到打印机,然后移动.jpg 到另一个名为 "DONE." 的文件夹下面的代码不起作用:但给出 "lp: Error - unable to access "test.jpg" - 没有这样的文件或目录"。感谢任何帮助!
#!/usr/bin/env python
import cups
import os
import time
import subprocess
from glob import glob
import shutil
conn = cups.Connection()
printers = conn.getPrinters()
printer_name = printers.keys()[0]
cups.setUser('pi')
path_to_watch = ('/home/pi/Desktop/PRINT/')
source = path_to_watch
dest1 = '/home/pi/Desktop/DONE'
before = dict ([(f, None) for f in os.listdir (path_to_watch)])
while 1:
time.sleep (10)
after = dict ([(f, None) for f in glob(path_to_watch + '*.jpg')])
added = [f for f in after if not f in before]
removed = [f for f in before if not f in after]
if added:
print "Added: ", ", ".join (added)
subprocess.Popen(["lp", "--"] + added).communicate()
shutil.move(source+f, dest1)
if removed: print "Removed: ", ", ".join (removed)
before = after
已编辑: 由于@metatoaster 的打印部分,这个半成品现在可以正常工作,但是移至 DONE 文件夹的操作效果不佳。也就是说,当我首先 运行 程序时,它会打印文件夹中已有的任何 .jpg,然后将 .jpg 文件从 PRINT 文件夹移动到 DONE,但是当我将新的 .jpg 放入 PRINT 时文件夹,它给我这个错误,然后退出脚本:
File "print2.py", line 30, in <module>
shutil.move(source+f, dest1)
File "/usr/lib/python2.7/shutil.py", line 302, in move
copy2(src, real_dst)
File "/usr/lib/python2.7/shutil.py", line 130, in copy2
copyfile(src, dst)
File "/usr/lib/python2.7/shutil.py", line 82, in copyfile
with open(src, 'rb') as fsrc:
IOError: [Errno 2] No such file or directory: '/home/pi/Desktop/PRINT//home/pi/Desktop/PRINT/test.jpg'
还有什么建议吗?谢谢!
生成错误 lp
是因为它无法在当前目录中找到 test.jpg
,这可能是您 运行 所在的目录 Python脚本来自。这是因为 os.listdir
返回的字符串列表只有目录的文件名,而没有完整路径本身。
>>> os.listdir('/tmp/foo/bar')
['file5.jpg', 'file4.jpg', 'file3.jpg', 'file2.jpg', 'file1.jpg', 'file5', 'file4', 'file3', 'file2', 'file1']
请注意,列出的所有文件都没有前面的目录,而不仅仅是 jpg
您可能想要的文件。解决这个问题的一种可能方法是为 os.listdir
返回的每个值加入 path_to_watch
值(这样 lp
就有完整的、明确的目标文件路径)并且过滤结果为 jpg,但后来我注意到您导入了 glob
。该模块提供了一个 glob
函数,它应该提供你所需要的,试试:
>>> from glob import glob
>>> glob('/tmp/foo/bar/*.jpg')
['/tmp/foo/bar/file5.jpg', '/tmp/foo/bar/file4.jpg', '/tmp/foo/bar/file3.jpg', '/tmp/foo/bar/file2.jpg', '/tmp/foo/bar/file1.jpg']
注意如何包含完整路径。要将其集成到您的代码中,您可能想尝试:
before = dict ([(f, None) for f in glob(path_to_watch + '*.jpg')])
我正在尝试使用 Python 2.7 在我的 Raspberry Pi 3B 上创建自动明信片打印脚本。我希望脚本在后台不断 运行 检查放入文件夹中的任何新 .jpg 文件,使用 CUPS/pycups 自动打印放入文件夹中的所有 .jpg 到打印机,然后移动.jpg 到另一个名为 "DONE." 的文件夹下面的代码不起作用:但给出 "lp: Error - unable to access "test.jpg" - 没有这样的文件或目录"。感谢任何帮助!
#!/usr/bin/env python
import cups
import os
import time
import subprocess
from glob import glob
import shutil
conn = cups.Connection()
printers = conn.getPrinters()
printer_name = printers.keys()[0]
cups.setUser('pi')
path_to_watch = ('/home/pi/Desktop/PRINT/')
source = path_to_watch
dest1 = '/home/pi/Desktop/DONE'
before = dict ([(f, None) for f in os.listdir (path_to_watch)])
while 1:
time.sleep (10)
after = dict ([(f, None) for f in glob(path_to_watch + '*.jpg')])
added = [f for f in after if not f in before]
removed = [f for f in before if not f in after]
if added:
print "Added: ", ", ".join (added)
subprocess.Popen(["lp", "--"] + added).communicate()
shutil.move(source+f, dest1)
if removed: print "Removed: ", ", ".join (removed)
before = after
已编辑: 由于@metatoaster 的打印部分,这个半成品现在可以正常工作,但是移至 DONE 文件夹的操作效果不佳。也就是说,当我首先 运行 程序时,它会打印文件夹中已有的任何 .jpg,然后将 .jpg 文件从 PRINT 文件夹移动到 DONE,但是当我将新的 .jpg 放入 PRINT 时文件夹,它给我这个错误,然后退出脚本:
File "print2.py", line 30, in <module>
shutil.move(source+f, dest1)
File "/usr/lib/python2.7/shutil.py", line 302, in move
copy2(src, real_dst)
File "/usr/lib/python2.7/shutil.py", line 130, in copy2
copyfile(src, dst)
File "/usr/lib/python2.7/shutil.py", line 82, in copyfile
with open(src, 'rb') as fsrc:
IOError: [Errno 2] No such file or directory: '/home/pi/Desktop/PRINT//home/pi/Desktop/PRINT/test.jpg'
还有什么建议吗?谢谢!
生成错误 lp
是因为它无法在当前目录中找到 test.jpg
,这可能是您 运行 所在的目录 Python脚本来自。这是因为 os.listdir
返回的字符串列表只有目录的文件名,而没有完整路径本身。
>>> os.listdir('/tmp/foo/bar')
['file5.jpg', 'file4.jpg', 'file3.jpg', 'file2.jpg', 'file1.jpg', 'file5', 'file4', 'file3', 'file2', 'file1']
请注意,列出的所有文件都没有前面的目录,而不仅仅是 jpg
您可能想要的文件。解决这个问题的一种可能方法是为 os.listdir
返回的每个值加入 path_to_watch
值(这样 lp
就有完整的、明确的目标文件路径)并且过滤结果为 jpg,但后来我注意到您导入了 glob
。该模块提供了一个 glob
函数,它应该提供你所需要的,试试:
>>> from glob import glob
>>> glob('/tmp/foo/bar/*.jpg')
['/tmp/foo/bar/file5.jpg', '/tmp/foo/bar/file4.jpg', '/tmp/foo/bar/file3.jpg', '/tmp/foo/bar/file2.jpg', '/tmp/foo/bar/file1.jpg']
注意如何包含完整路径。要将其集成到您的代码中,您可能想尝试:
before = dict ([(f, None) for f in glob(path_to_watch + '*.jpg')])