2017-09-20 102 views
0

我正在實現一個工作流程,該工作流程的一部分是調用一個python腳本,並在該python腳本中讓每個級別運行一個可執行文件或python程序。MPI對一個進程分級

所以要測試我寫了一個簡單的程序,但它不能正常工作。下面的代碼描述:

helloworld.py

from mpi4py import MPI 
import sys 
import subprocess 

mpi_warn_on_fork = 0 

size = MPI.COMM_WORLD.Get_size() 
rank = MPI.COMM_WORLD.Get_rank() 
name = MPI.Get_processor_name() 

for i in range(size): 
    if rank == i: 
    command = "python hello.py %d %d %s" % (rank, size, name) 
    subprocess.call("command", shell = True) 

hello.py

import sys 
print "Hello from rank = %s of %s on host %s" %(sys.argv[1], sys.argv[2], sys.argv[3]) 

我通過使用調用程序: 的mpirun -np 16蟒helloworld.py

但是這個實現並不起作用,因爲只有一個等級中的16個爲mpirun運行時生成一個生成戰爭的進程ning有關在程序中使用fork的消息。

有人可以請推薦一些東西,這樣我可以允許每個MPI級別正確執行shell命令。

編輯: 在C/C++中實現這個想法的建議也可以使用。

+1

不要使用'shell = True';只需編寫'subprocess.check_call([「python」,「hello.py」,str(rank),str(size),name])''。 –

+0

如果在運行該命令之前,您確實不需要使用通信器進行操作,那麼甚至可以使用沒有MPI庫的Python或甚至是shell腳本來執行MPI程序。 –

回答

0

您不能在helloworld.py(它是一個變量,而不是字符串)的最後一行中引用"command"

command = "python hello.py %d %d %s" % (rank, size, name) 
subprocess.call(command, shell = True) 
+0

感謝@JorgeBellón的審查 –