首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印入圈

问打印入圈
EN

Stack Overflow用户
提问于 2019-08-01 12:07:20
回答 1查看 121关注 0票数 0

我有以下代码要打印到系统默认打印机:

代码语言:javascript
复制
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())

如果我单独使用这个函数,它会运行得很好。但是,如果在这样的循环构造中使用它:

代码语言:javascript
复制
while True:
     printFile(file)
     (...)

打印作业不会运行(尽管)循环将继续,不会出错.

我试着拖延时间,但没能帮上忙.

编辑:进一步的调查显示,打印函数(从循环中调用)将暂停打印作业.?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-01 12:54:21

在现代Python3中,建议在大多数情况下使用subprocess.run()而不是直接使用subprocess.Popen。我将把它留给lpr来读取文件,而不是将它传递给标准输入:

代码语言:javascript
复制
def printFile(file):
    print("printing file...")
    cp = subprocess.run(['\usr\bin\lpr', file])
    return cp.returncode

使用subprocess.run可以确定lpr进程是否正确完成。这样你就不用读和写完整的文件了。您甚至可以在lpr完成后删除该文件。

直接使用Popen存在一些缺点;

  1. 如果Popen.stdin超过OS管道缓冲区(根据Python ),那么使用它可能会产生死锁。
  2. 由于您不需要wait()来完成Popen进程,所以您不知道它是否在没有错误的情况下完成。

根据lpr的设置方式,它可能有速率控制。也就是说,如果在短时间内收到大量打印请求,它可能会停止打印。

编辑:我只是想到了一些事情。大多数lpr实现允许您一次打印多个文件。所以你也可以:

代码语言:javascript
复制
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

一次打印一个文件或者一整堆文件.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57308692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档