Python 将文件作为子进程打开

Python 将文件作为子进程打开,python,multithreading,subprocess,Python,Multithreading,Subprocess,我只是在监视文件是否仍然打开时尝试基本打开文件,但它只是打开并退出。关于为什么会发生这种情况有什么建议吗 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)

我只是在监视文件是否仍然打开时尝试基本打开文件,但它只是打开并退出。关于为什么会发生这种情况有什么建议吗

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()

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

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

文件将在
语句开始时用
打开,然后关闭。

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

t1 = threading.Thread(target=new.start)
使用:

并更改函数
Opener.start
,使其打开一个文件并询问其状态。大概是这样的:

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

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

问题是

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

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


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

Popen
将可执行文件作为参数,而不是图像。你想实现什么?我使用了shell参数,它像在命令行上一样运行参数,它像应该的那样打开图片,但它会一直等到它关闭。你可以使用windows或linux吗?我试图检查它是否关闭,而不仅仅是读取内容。我还试图通过windows上的默认程序启动它,所以我必须从外壳上运行它,然后你应该看看
while sub.poll():
    pass