如何运行使用子进程的同一Python脚本的多个实例。

2024-10-04 09:20:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python脚本job.py,它接受命令行参数。该脚本使用Python包subprocess运行一些外部程序。脚本和外部程序都是顺序的(即没有MPI、openMP等)。我想运行这个脚本4次,每次使用不同的命令行参数。我的处理器有4个内核,因此我想同时运行所有4个实例。如果我打开4个终端,并在单独的终端中运行脚本的每个实例,那么它将完美地工作,并且我可以得到我想要的东西。在

现在我想让自己更容易地启动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之后,我得到:

^{pr2}$

所以我认为,我试图在后台运行job.py,而{}本身试图通过subprocess在后台运行其他东西。这显然行不通,原因我不明白。在

有没有一种方法可以在不需要多个终端的情况下运行job.py多次?在

编辑1

根据建议,我尝试了multiprocessingthread和{}包。在最好的情况下,只有一个实例正常运行。我试过一个很难看的解决办法。我编写了一个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'这是my.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和{},而不是在实际的命令行中包含/bin/bash以传递给shell。注意:foam现在是指向文件的路径,而不是别名。在


Tags: 文件实例py脚本cmdbashconfig终端
1条回答
网友
1楼 · 发布于 2024-10-04 09:20:10

您可以从Python中并行化:

import multiprocessing
import subprocess

def run_job(spec):
    ...
    if spec ...:
        subprocess.call(...)

def run_all_jobs(specs):
    pool = multiprocessing.Pool()
    pool.map(run_job, specs)

它的优点是可以监视/记录/调试并行化。在

相关问题 更多 >