将文件作为子进程打开

时间:2017-01-03 15:16:20

标签: 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)
        while sub.poll():
            pass
        print "closed"
new = Opener("test.jpg")
t1 = threading.Thread(target=new.start)
t1.start()

3 个答案:

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

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