我有一個接受命令行參數的Python腳本job.py
。該腳本使用Python包subprocess
來運行一些外部程序。腳本和外部程序都是順序的(即沒有MPI,openMP等)。我想運行這個腳本4次,每次使用不同的命令行參數。我的處理器有4個內核,因此我想同時運行所有4個實例。如果我打開4個終端並在單獨的終端中運行腳本的每個實例,它將完美工作,並且我得到我想要的。如何運行使用subprocess.call的同一Python腳本的多個實例
現在我想讓自己更容易啓動4個實例,以便我可以使用單個終端的單個命令完成所有這些操作。爲此,我使用bash腳本batch.sh
:
python job.py 4 0 &
python job.py 4 1 &
python job.py 4 2 &
python job.py 4 3 &
這不起作用。事實證明,subprocess
是這裏的罪魁禍首。所有Python代碼完美運行,直到它擊中subprocess.call
之後,我得到:
[1]+ Stopped python job.py 4 0
所以我怎麼看它,就是我想在後臺運行job.py
和job.py
本身試圖在後臺運行別的東西通過subprocess
。這顯然不起作用,原因我不明白。
有沒有辦法多次運行job.py
而不需要多個終端?
編輯#1
關於建議我嘗試了multiprocessing
,thread
和threading
包。在最好的情況下,只有一個實例正常運行。我嘗試了一個醜陋的解決方法,它工作。我做了一個bash腳本這會打開一個新的終端的每個實例:
konsole -e python job.py 4 0
konsole -e python job.py 4 1
konsole -e python job.py 4 2
konsole -e python job.py 4 3
編輯#2
下面是一個使用subprocess.call
實際功能(注:subprocess
導入爲sp
)。
def run_case(path):
case = path['case']
os.chdir(case)
cmd = '{foam}; {solver} >log.{solver} 2>&1'.format(foam=CONFIG['FOAM'],
solver=CONFIG['SOLVER'])
sp.call(['/bin/bash', '-i', '-c', cmd])
讓我填補了空白點:
CONFIG
是一個全局定義字典。CONFIG['FOAM'] = 'of40'
這是我的.bashrc中的一個別名,用於源文件屬於我正在運行的二進制文件。CONFIG['SOLVER'] = 'simpleFoam'
這是我正在運行的二進制文件。
編輯#3
我終於得到它與這個
def run_case():
case = CONFIG['PATH']['case']
os.chdir(case)
cmd = 'source {foam}; {solver} >log.simpleFoam 2>&1'.format(foam=CONFIG['FOAM'],
solver=CONFIG['SOLVER'])
sp.call([cmd], shell=True, executable='/bin/bash')
該解決方案的工作是制定雙方shell=True
和executable='/bin/bash'
而是包括/bin/bash
在實際的命令行傳遞給shell。注意:foam
現在是到文件而不是別名的路徑。
'停止'可能意味着'job.py'的實例完成。 – Apalala
我不認爲這與'subprocess'模塊有什麼關係。我認爲你正在運行的程序想要寫入'stdout',並且接收到一個'SIGTTOU',因爲你已經將它放在後臺,所以它無法訪問控制終端。這是標準行爲。從程序捕獲輸出(設置'stdout = subprocess.PIPE'和'stderr = subprocess.PIPE')可能會起作用,但是您需要正確處理程序輸出(請參閱'subprocess.Popen'和'communic''方法)。 – larsks
你應該使用線程來訪問你的不同內核。 https://www.tutorialspoint.com/python/python_multithreading.htm – Tobey