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