我有python脚本,它接受命令行参数。我获取命令行参数的方法是通过读取mongo数据库。我需要迭代mongo查询并使用mongo查询中的不同命令行参数为单个脚本启动不同的进程。
关键是,我需要启动的流程:
我认为命令killall -9 script.py
可以工作并满足第二个约束条件。
修改1
从下面的答案中,launcher.py
程序看起来像这样
def main():
symbolPreDict = initializeGetMongoAllSymbols()
keys = sorted(symbolPreDict.keys())
for symbol in keys:
# Display key.
print(symbol)
command = ['python', 'mc.py', '-s', str(symbol)]
print command
subprocess.call(command)
if __name__ == '__main__':
main()
问题是mc.py
有一个阻止
receiver = multicast.MulticastUDPReceiver ("192.168.0.2", symbolMCIPAddrStr, symbolMCPort )
while True:
try:
b = MD()
data = receiver.read() # This blocks
...
except Exception, e:
print str(e)
当我运行启动器时,它只执行mc.py
中的一个(至少有39个)。如何修改启动程序以说“在后台运行已启动的脚本”,以便脚本返回启动程序以启动更多脚本?
修改2
通过将subprocess.call(command)
替换为subprocess.Popen(command)
但有一件事我注意到,如果我说ps ax | grep mc.py
,那么PID似乎完全不同。我认为我不在乎,因为我可以使用killall
轻松杀死它们。
[更正]用pkill -f xxx.py
答案 0 :(得分:1)
从脚本启动脚本有几种选择。最简单的可能是使用subprocess
或os
模块。
我已多次这样做以启动集群中的节点分离。使用os
可能看起来像这样:
import os
for i in range(len(operations)):
os.system("python myScript.py {:} {:} > out.log".format(arg1,arg2))
使用killall你应该没有问题终止以这种方式产生的进程。
另一种选择是使用subprocess
,它具有广泛的功能,并且比os.system
更灵活。示例可能如下所示:
import subprocess
for i in range(len(operations)):
command = ['python','myScript.py','arg1','arg2']
subprocess.call(command)
在这两种方法中,进程都是独立的,除了父PID之外别无共享。