我必须在Windows 7上启动并执行24个独立的Python脚本。我希望这个脚本可以同时启动它们,而不必统治所有的(我不是索隆)或者等待它们的结束。 我发现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")
如何将参数发送到这些脚本并一起启动它们?
您可以使用独立进程(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'
然后,您可以跟踪每个子进程执行哪个命令,只是简单地存储与workid关联的命令(当队列被新工作填满时,workid可以是一个递增的计数器)。 multiprocessing.Queue的使用是健壮的,因为你不需要依靠标准输出/ err解析,你也避免了相关的限制。 而且,您可以轻松管理更多的子流程。
然后,你也可以设置一个超时时间,你需要一个get调用等待最长时间,例如:
import Queue try: res = result.get(block = True, timeout = 10) except Queue.Empty: print error
你想使用subprocess模块: http : //docs.python.org/library/subprocess.html ,特别是本小节中的第一个例子,在产卵过程中不等待它们完成http://docs.python.org/库/ subprocess.html#替换最OS-产卵家庭
像这样的东西?
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)
使用子流程模块(http://docs.python.org/library/subprocess.html#module-subprocess)中的调用函数。
import subprocess subprocess.call([path, arg1, arg2...])