2011-07-20 32 views
5

我必须在Windows 7上启动并执行24个独立的Python脚本。我希望这一个脚本可以在同一时间启动它们,而不必管它们全部(我不是索隆)或等待它们的结束。我发现os.startfile()很有趣。但我并没有在发送参数的24如何从一个启动多个其他的Python脚本并发送参数?

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") 

如何将参数发送到这些脚本并将它们一起启动?

+1

有一个看看'multiprocessing'模块。它使得它更清洁,并且实际上是同样的东西(它在Linux上更加高效,因为它会影响当前进程。在Windows上,我认为它与启动多个新的Python进程是一样的)。但是,如果您确实想要完成您所描述的内容,请查看“subprocess”模块而不是“os.startfile”。 –

回答

-1

从子模块(HTTP使用呼叫功能://文档.python.org /库/ subprocess.html#模块子)。

import subprocess 
subprocess.call([path, arg1, arg2...]) 
+1

我不认为这是问了什么......从文档:带参数的_Run命令。 **等待命令完成**,然后返回returncode属性._ – mac

0

这样的事情?

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) 
3

可以使用indipendent处理(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的使用非常强大,因为您不需要依赖stdout/err解析并避免相关限制。 此外,您可以轻松管理更多子流程。

然后,你还可以设置你想要多久get调用等待在最大超时,如:

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