【问题标题】:opening a file as a subprocess作为子进程打开文件
【发布时间】:2017-01-03 15:16:20
【问题描述】:

我只是试图在监视文件是否仍然打开的同时进行文件的基本打开,但它只是打开它并退出。关于为什么会发生这种情况的任何建议?

class Opener:
    def __init__(self, file_path):
        self.file_path = file_path
        self.process = None

    def start(self):
        sub = subprocess.Popen(self.file_path, shell=True)
        while sub.poll():
            pass
        print "closed"
new = Opener("test.jpg")
t1 = threading.Thread(target=new.start)
t1.start()

【问题讨论】:

  • Popen 将可执行文件作为参数,而不是图像。你想达到什么目标?
  • 我使用了 shell 参数,它像在命令行上一样运行参数,它会按原样打开图片,但它会等到它关闭
  • 你用的是windows还是linux?

标签: python multithreading subprocess


【解决方案1】:

这仅适用于带有 shell=True 的 Windows,因为扩展名的默认程序用于打开给定文件,相当于使用 cmd /c Path\To\File

问题是

while sub.poll():
    pass

不是你想要的。 sub.poll() 在程序运行时返回 None,并在程序完成时返回退出代码。如果程序在到达此循环之前以 0 以外的退出代码终止,那么它将继续循环并消耗 CPU。如果程序仍在运行或已成功完成,则根本不进入循环。

使用poll()检查进程是否仍在运行应该通过检查sub.poll() is None来完成,或者更好地使用sub.wait()。

然而,有些程序只允许一个活动实例,如果您尝试启动第二个实例,它将在打开的窗口中打开文件并立即退出。在这种情况下,没有简单的方法可以知道文件是否仍然在应用程序中打开。所以行为也取决于注册的程序。

【讨论】:

    【解决方案2】:

    不要使用subprocess.Popen 打开文件。正如您在documentation 中看到的那样,它用于在新进程中运行子程序。但是如果你想打开一个文件进行阅读,那么

    with open(self.file_path, 'r') as f:
        # do somethin here
        pass
    

    文件将在with 语句的开头打开并在之后关闭。

    【讨论】:

    • 我正在尝试检查它是否已关闭,而不仅仅是阅读内容。我也试图通过 Windows 上的默认程序启动它,所以我必须从 shell 运行它
    【解决方案3】:

    Popen 旨在创建新进程(例如,从您的 python 脚本执行另一个程序),而不是打开文件。您可以使用mutiprocessing 模块执行在不同进程中打开文件的功能,而不是

    t1 = threading.Thread(target=new.start)
    

    使用:

    t1 = multiprocessing.Process(target=new.start)
    

    并更改函数Opener.start,以便它打开一个文件并询问它的状态。像这样的:

    def start(self):
        sub = open(self.file_path)
        while not sub.closed:
            pass
        print "closed"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-14
      • 2013-11-06
      • 2013-05-07
      • 2011-09-07
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      相关资源
      最近更新 更多