问题描述
我有一个python代码,该代码使用subprocess.Popen
和mpirun
运行另一个应用程序。
代码会在一台机器上完美运行,而在另一台机器上却遇到问题。
但是我还有一个较旧的conda环境,它可以在其中工作。
重现的最少代码如下:
from subprocess import Popen
from mpi4py import MPI
proc = Popen("mpirun -n 2 echo 1".split())
此行proc
立即终止,proc.poll()
返回1
。 python scrip实际上并不使用MPI,它只是以python script.py
的身份运行,但是它依赖于另一个调用MPI的程序。我需要使用mpirun
重复运行另一个代码(当然,我实际上并没有执行echo 1
)。
我认为这取决于安装的MPI:
工作:
$ conda list -n ForkTPS | grep mpi
WARNING: The conda.compat module is deprecated and will be removed in a future release.
fftw 3.3.8 mpi_mpich_hc19caf5_1012 conda-forge
h5py 2.10.0 nompi_py38h7442b35_105 conda-forge
hdf5 1.10.6 mpi_mpich_hc096b2c_1010 conda-forge
mpi 1.0 mpich conda-forge
mpi4py 3.0.3 py38h4a80816_2 conda-forge
mpich 3.3.2 hc856adb_2 conda-forge
以及
conda list | grep mpi
dask-mpi 2.21.0 pypi_0 pypi
fftw 3.3.8 mpi_mpich_h3f9e1be_1011 conda-forge
hdf5 1.10.5 mpi_mpich_ha7d0aea_1004 conda-forge
impi_rt 2019.8 intel_254 intel
libnetcdf 4.7.4 mpi_mpich_h755db7c_1 conda-forge
mpi 1.0 mpich
mpi4py 3.0.3 py37hf484d3e_7 intel
mpich 3.3.2 hc856adb_0 conda-forge
netcdf4 1.5.3 mpi_mpich_py37h91af3bc_3 conda-forge
不起作用:
conda list | grep mpi
fftw 3.3.8 mpi_openmpi_h6dd7431_1011 conda-forge
hdf5 1.10.6 mpi_openmpi_hac320be_1 conda-forge
mpi 1.0 openmpi conda-forge
mpi4py 3.0.3 py38h246a051_2 conda-forge
openmpi 4.0.5 hdf1f1ad_1 conda-forge
是否有合理且可复制的方法来避免此问题?我必须将我的代码提供给多个协作者。乍一看,我认为区别在于使用MPICH
与OpenMPI
。
解决方法
至少对于Open MPI,您不能从MPI程序派生并执行$suffix = ":r ""$CurrentDir\$DeleteTempTableScript""`r`nGO"
(Get-ChildItem $TFSDirectory"Schemas" -Filter *.sql -Recurse).FullName |
ForEach-Object {
"PRINT '$_'"
"GO"
":r ""$_"""
"GO"
$suffix
} | Set-Content -Path $MasterSQLFileName -Encoding UTF8
(Get-ChildItem $TFSDirectory"Functions" -Filter *.sql -Recurse).FullName |
ForEach-Object {
"PRINT '$_'"
"GO"
":r ""$_"""
"GO"
$suffix
} | Add-Content -Path $MasterSQLFileName -Encoding UTF8
(Get-ChildItem $TFSDirectory"Sequences" -Filter *.sql -Recurse).FullName |
ForEach-Object {
"PRINT '$_'"
"GO"
":r ""$_"""
"GO"
$suffix
} | Add-Content -Path $MasterSQLFileName -Encoding UTF8
。
由于您mpirun
,python脚本以单例模式运行,因此您无法from mpi4py import MPI
摆脱Popen(["mpirun",...)
这一行应该可以解决您的问题。