如何从一个脚本同时启动多个其他Python脚本并传递参数?

5 投票
4 回答
1896 浏览
提问于 2025-04-16 21:56

我需要在Windows 7上同时启动和执行24个独立的Python脚本。我希望有一个脚本可以同时启动这24个脚本,而不需要控制它们的运行,也不想等它们都结束。我觉得os.startfile()这个方法很有意思,但我没能成功给这24个脚本传递参数。

coincoin1.py(要启动的24个脚本之一)

import sys
print "hello:",sys.argv 

Anti_Sauron_script.py(将同时启动这24个脚本的那个脚本)

sys.argv=["send","those","arguments"] 
os.startfile("C:\\Users\\coincoin1.py")

如何给这些脚本传递参数并同时启动它们呢?

4 个回答

1

像这样吗?

from subprocess import Popen, PIPE

python_scripts = ['coincoin1.py','coincoin2.py','coincoin3.py'...]
args = ' -w hat -e ver'

procs = []
for f in python_scripts:
    procs.append(Popen(f+args, shell=True,stdout=PIPE,stderr=PIPE))

results = []

while procs:
    results.append (procs.pop(0).communicate())

do_something_with_results(resuls)
2

你想使用 subprocess 模块:http://docs.python.org/library/subprocess.html,特别是这一小节中关于如何启动进程而不等待它们完成的第一个例子:http://docs.python.org/library/subprocess.html#replacing-the-os-spawn-family

4

你可以使用一个独立的进程(multiprocessing.Process),并通过两个队列(multiprocessing.Queue)来和它进行沟通,一个队列用来输入数据,另一个用来输出数据。

import multiprocessing

def processWorker(input, result):
    work = input.get()
    ## execute your command here
    pipe = subprocess.Popen(command, stdout = subprocess.PIPE,
                             stderr = subprocess.PIPE, shell = True)
    stdout, stderr = pipe.communicate()
    result.put(pipe.returncode)

input  = multiprocessing.Queue()
result = multiprocessing.Queue()

p = multiprocessing.Process(target = processWorker, args = (input, result))
p.start()
commandlist = ['ls -l /', 'ls -l /tmp/']
for command in commandlist:
    input.put(command)
for i in xrange(len(commandlist)):
    res = result.get(block = True)
    if not res is 0:
        print 'One command failed'

接着,你可以通过存储与工作ID(workid)相关的命令来跟踪每个子进程正在执行的命令(工作ID可以是一个计数器,当队列里有新任务时就增加这个计数器)。使用multiprocessing.Queue非常可靠,因为你不需要依赖标准输出或错误输出的解析,也避免了相关的限制。此外,你还可以轻松管理更多的子进程。

另外,你还可以设置一个超时时间,来限制获取数据的最长等待时间,比如:

import Queue
try:
    res = result.get(block = True, timeout = 10)
except Queue.Empty:
    print error

撰写回答