我只是尝试在监视文件是否仍然打开的同时进行文件的基本打开,但它只是打开并退出。有什么建议吗?
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()
答案 0 :(得分:0)
请勿使用subprocess.Popen
打开文件。正如您在documentation 中所看到的,它用于在新进程中运行子程序。但是如果你想打开一个文件进行阅读
with open(self.file_path, 'r') as f:
# do somethin here
pass
该文件将在with
语句的开头打开,然后关闭。
答案 1 :(得分:0)
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"
答案 2 :(得分:0)
这仅适用于shell=True
的Windows,因为扩展程序的默认程序用于打开指定文件,它相当于使用cmd /c Path\To\File
问题在于
while sub.poll():
pass
不是你想要的。程序运行时sub.poll()
返回None
,程序完成后退出代码退出代码。如果程序在到达此循环之前使用退出代码而不是0终止,则它将继续循环并消耗CPU。如果程序仍在运行或已成功完成,则根本不会输入循环。
使用poll()
检查流程是否仍在运行时,应选中sub.poll() is None
,或者更好地使用sub.wait()
。
但是有些程序只允许一个活动实例,如果你尝试启动第二个实例,它将在打开的窗口中打开文件并立即退出。在这种情况下,没有简单的方法来知道文件仍然在应用程序中打开。所以行为也取决于注册的程序。