通过subprocess.Popen方法由单个程序运行3个python程序

时间:2014-03-25 10:39:08

标签: python subprocess concurrent-programming

我试图通过运行单个python程序同时运行3个python程序

我在一个单独的python程序sample.py

中使用以下脚本

Sample.py:

import subprocess
subprocess.Popen(['AppFlatRent.py'])
subprocess.Popen(['AppForSale.py'])
subprocess.Popen(['LandForSale.py'])

包括python.py在内的所有三个程序都在同一个文件夹中。

Error:  OSError: [Errno 2] No such file or directory

有人可以指导我如何使用subprocess.Popen方法吗?

3 个答案:

答案 0 :(得分:0)

找不到该文件,因为当前工作目录未正确设置。在Popen中使用参数cwd="/path/to/script"

答案 1 :(得分:0)

这是因为执行sample.py时脚本不在当前目录中。 如果您的三个脚本与sample.py位于同一目录中,则可以使用:

import os
import subprocess
DIR = os.path.dirname(os.path.realpath(__file__))

def run(script):
    url = os.path.join(DIR, script)
    subprocess.Popen([url])

map(run, ['AppFlatRent.py','AppForSale.py', 'LandForSale.py'])

但老实说,如果我是你,我会用bash脚本来做。

答案 2 :(得分:0)

某些脚本中可能缺少shebang(#!..)或未设置可执行权限(chmod +x)。

您可以明确提供Python可执行文件:

#!/usr/bin/env python
import inspect
import os
import sys
from subprocess import Popen

scripts = ['AppFlatRent.py', 'AppForSale.py', 'LandForSale.py']

def realpath(filename):
    dir = os.path.realpath(os.path.dirname(inspect.getsourcefile(realpath)))
    return os.path.join(dir, filename)

# start child processes
processes = [Popen([sys.executable or 'python', realpath(scriptname)])
             for scriptname in scripts]

# wait for processes to complete
for p in processes:
    p.wait() 

以上假设脚本名称是相对于模块给出的。

考虑使用threadingmultiprocessing模块导入模块并运行相应的函数,而不是直接将它们作为脚本运行。