2011-05-25 30 views
1

我是Python的新手。我最近嘗試使用Python腳本來調用一個需要很長時間的進程的控制檯exe文件。我會允許exe被多次調用,因爲CPU可以允許。當exe文件完成工作時。它應該釋放CPU到其他新的作業。所以我想我可能需要多重過程控制機制。python multiprocessing無法控制多個長時間運行的控制檯exe文件?

由於多處理只能調用python callable函數。它不能直接調用控制檯EXE。我在python函數中包裝了subprocess.Popen(cmd)。然而,在我這樣做之後,我發現在多處理之前使用了.Process.start()。該exe已經開始。問題在於它完成它所做的事情(需要很長時間)之前,它不會讓我控制。該計劃凍結等待。這不是我想要的。

我張貼的代碼如下:

import sys 

import os 

import multiprocessing 

import subprocess 

def subprocessExe(cmd): 

     return subprocess.call(cmd, shell=False, stdout=subprocess.PIPE, \ 
           stderr=subprocess.PIPE,creationflags=0x08000000) 

if __name__ == '__main__': 

     p = multiprocessing.Process(target=self.subprocessExe(exeFileName)) 

     p.start() 

     print p, p.is_alive() 

謝謝您的時間!

回答

2

當您創建multiprocessing.Process對象時,您正在致電subprocessExec。你應該這樣做:

p = multiprocessing.Process(target=subprocessExec, args=(exeFileName,)) 

然後它應該工作。

+0

我嘗試這樣做。這是行不通的。在Python自己的forking.py模塊中出現錯誤。 – Mua 2011-05-26 14:09:01

+0

我用的正是你在那裏寫的。但我的文件名在那裏有一個空間。因爲它有爭論。所以我的「cmd」就像是「* .exe xyz」。它與子進程沒有問題.Popen。但是如果我把整個字符串「cmd」放在multiprocessing.processing的arg中。它報告「picklingerror」的錯誤 – Mua 2011-05-26 14:12:09

+0

在cmd字符串中再次嘗試沒有空格。只有一個exe文件。它仍然報告錯誤。我正在使用Python 2.6。 – Mua 2011-05-26 14:19:20

1

測試用例中有很多錯誤的東西。對我來說,下面的工作:

import multiprocessing, subprocess 

def subprocessExe(cmd): 
    subprocess.call([cmd], shell=False) 

p = multiprocessing.Process(target=subprocessExe, args=('/full/path/to/script.sh',)) 
p.start() 

OR

subprocess.call([cmd], shell=True) 
p = multiprocessing.Process(target=subprocessExe, args=('script.sh',)) 

OR

subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE, \ 
           stderr=subprocess.PIPE) 
+0

您可能還想在p.start()之前添加'p.daemon = True' – 2011-05-26 15:22:06