2013-01-09 99 views
7

我想用subprocess.call在Python中運行外部應用程序。從我讀過的內容來看,subprocess.call不應該被阻塞,除非你調用Popen.wait,但是對於我來說它會阻塞,直到外部應用程序退出。我該如何解決?Python子進程調用阻塞

回答

-1

subprocess中的代碼實際上非常簡單易讀。只要看到3.32.7版本(視情況而定),你就可以知道它在做什麼。

例如,call看起來是這樣的:

def call(*popenargs, timeout=None, **kwargs): 
    """Run command with arguments. Wait for command to complete or 
    timeout, then return the returncode attribute. 

    The arguments are the same as for the Popen constructor. Example: 

    retcode = call(["ls", "-l"]) 
    """ 
    with Popen(*popenargs, **kwargs) as p: 
     try: 
      return p.wait(timeout=timeout) 
     except: 
      p.kill() 
      p.wait() 
      raise 

你可以做同樣的事情,而不調用wait。創建一個Popen,不要打電話給wait,這正是你想要的。

+20

有幫助,但居高臨下。 – dpitch40

5

您正在閱讀錯誤的文檔。根據他們:

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) 

運行由args描述的命令。等待命令完成,然後返回returncode屬性。

+0

哦,好的。如何複製使用選項P_NOWAIT調用os.spawnl的功能? – dpitch40

+1

@ dpitch40 - http://docs.python.org/2/library/subprocess.html#replacing-the-os-spawn-family。 –