2012-02-14 38 views
1

我想知道如何以这样的方式调用外部程序,以便在Python程序运行时允许用户继续与我的程序的UI(使用tkinter构建,如果它很重要)进行交互。程序等待用户选择要复制的文件,因此在外部程序运行时,它们仍应能够选择和复制文件。外部程序是Adobe Flash Player。在Python中同时运行外部程序

也许一些困难是由于我有一个线程“工人”类的事实?它在复制时更新进度条。即使Flash Player处于打开状态,我也希望更新进度条。

  1. 我试过subprocess模块。该程序运行,但它阻止用户在Flash Player关闭之前使用UI。此外,复制仍然似乎发生在后台,只是在Flash Player关闭之前进度条才会更新。

    def run_clip(): 
        flash_filepath = "C:\\path\\to\\file.exe" 
    
        # halts UI until flash player is closed... 
        subprocess.call([flash_filepath])    
    
  2. 接着,我尝试使用concurrent.futures模块(我是使用Python 3反正)。由于我仍然使用subprocess来调用应用程序,因此这段代码的行为与上面的例子完全相同并不奇怪。

    def run_clip(): 
        with futures.ProcessPoolExecutor() as executor: 
        flash_filepath = "C:\\path\\to\\file.exe" 
        executor.submit(subprocess.call(animate_filepath)) 
    

请问问题出在哪里使用subprocess?如果是这样,有没有更好的方法来调用外部程序?提前致谢。

回答

7

你只需要继续阅读关于subprocess模块,特别是关于Popen

同时运行后台进程,您需要使用subprocess.Popen

import subprocess 

child = subprocess.Popen([flash_filepath]) 
# At this point, the child process runs concurrently with the current process 

# Do other stuff 

# And later on, when you need the subprocess to finish or whatever 
result = child.wait() 

你也可以用子输入和输出流通过Popen -object的成员(在这种情况下child)进行交互。

+0

太好了,'child = subprocess.Popen'确实有效。我必须更熟悉模块的方法,但感谢使用'wait'的信息。 – gary 2012-02-14 16:27:13