监视添加的.jpg文件夹,使用CUPS自动打印,将相同的.jpg移至另一个文件夹

时间:2019-01-08 07:44:38

标签: python cups

我正在尝试使用Python 2.7在Raspberry Pi 3B上创建自动明信片打印脚本。我希望脚本继续在后台运行,以检查放置在文件夹中的任何新.jpg文件,使用CUPS / pycups将文件夹中放置的所有.jpg自动打印到打印机,然后将.jpg移动到另一个名为“完成。”以下代码不起作用:但是给出“ lp:错误-无法访问” 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作为打印部件,因此此方法可以成功进行,但是移至“完成”文件夹后无法有效进行。也就是说,当我第一次运行该程序时,它将对文件夹中已有的.jpg文件进行PRINT,然后将.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'

还有其他建议吗?谢谢!

1 个答案:

答案 0 :(得分:0)

正在生成错误lp是因为它在当前目录(可能是您从中运行该Python脚本的目录)中找不到test.jpg。之所以这样,是因为os.listdir返回的字符串列表仅具有目录文件的名称,而没有完整路径本身。

>>> os.listdir('/tmp/foo/bar')
['file5.jpg', 'file4.jpg', 'file3.jpg', 'file2.jpg', 'file1.jpg', 'file5', 'file4', 'file3', 'file2', 'file1']

请注意,列出的所有文件都没有前面的目录,而不仅仅是jpg个文件,可能与您想要的一样。解决此问题的一种可能方法是为path_to_watch返回的每个值加入os.listdir值(以便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')])