Python 循环打印
我有以下代码要打印到系统默认打印机:Python 循环打印,python,linux,python-3.x,Python,Linux,Python 3.x,我有以下代码要打印到系统默认打印机: def打印文件(文件): 打印(“打印文件…”) 以open(文件“rb”)作为源: printer=subprocess.Popen('/usr/bin/lpr',stdin=subprocess.PIPE) printer.stdin.write(source.read()) 如果我单独使用这个函数,它会工作得很好。但是如果在这样的循环构造中使用它: 为True时: 打印文件(文件) (...) 打印作业将不会运行(尽管)循环将继续,不会出现错误 我
def打印文件(文件):
打印(“打印文件…”)
以open(文件“rb”)作为源:
printer=subprocess.Popen('/usr/bin/lpr',stdin=subprocess.PIPE)
printer.stdin.write(source.read())
如果我单独使用这个函数,它会工作得很好。但是如果在这样的循环构造中使用它:
为True时:
打印文件(文件)
(...)
打印作业将不会运行(尽管)循环将继续,不会出现错误
我试图建立一个时间延迟,但它没有帮助
[编辑]:进一步的调查表明,打印功能(从循环调用时)将暂停打印作业…?在现代Python 3中,建议在大多数情况下使用
subprocess.run()
,而不是直接使用subprocess.Popen
。我将把它留给lpr
读取文件,而不是将其传递给标准输入:
def printFile(file):
print("printing file...")
cp = subprocess.run(['\usr\bin\lpr', file])
return cp.returncode
使用subprocess.run
可以确保lpr
进程正确完成。这样你就不必读写完整的文件了。您甚至可以在lpr
完成后删除该文件
直接使用Popen
在这里有一些缺点
Popen.stdin
可能会产生死锁,如果它超出了OS管道缓冲区(根据Python文档)Popen
进程完成wait()
lpr
实现允许您一次打印多个文件。所以你也可以做:
def printFile(files):
"""
Print file(s).
Arguments:
files: string or sequence of strings.
"""
if isinstance(files, str):
files = [files]
# if you want to be super strict...
if not isinstance(files (list, tuple)):
raise ValueError('files must be a sequence type')
else:
if not all(isinstance(f, str) for f in files):
raise ValueError('files must be a sequence of strings')
cp = subprocess.run(['\usr\bin\lpr'] + files)
return cp.returncode
可以一次打印一个文件或一堆文件