我有以下代码要打印到系统默认打印机:
def printFile(file):
print("printing file...")
with open(file, "rb") as source:
printer = subprocess.Popen('/usr/bin/lpr', stdin=subprocess.PIPE)
printer.stdin.write(source.read())如果我单独使用这个函数,它会运行得很好。但是,如果在这样的循环构造中使用它:
while True:
printFile(file)
(...)打印作业不会运行(尽管)循环将继续,不会出错.
我试着拖延时间,但没能帮上忙.
编辑:进一步的调查显示,打印函数(从循环中调用)将暂停打印作业.?
发布于 2019-08-01 12:54:21
在现代Python3中,建议在大多数情况下使用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 ),那么使用它可能会产生死锁。wait()来完成Popen进程,所以您不知道它是否在没有错误的情况下完成。根据lpr的设置方式,它可能有速率控制。也就是说,如果在短时间内收到大量打印请求,它可能会停止打印。
编辑:我只是想到了一些事情。大多数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一次打印一个文件或者一整堆文件.
https://stackoverflow.com/questions/57308692
复制相似问题