启动单个 python 脚本,因为不同的进程因命令行参数而异
Launch a single python script as different processes differing by command line arguments
我有 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个)。我如何修改启动器程序说 "run the launched script in background" 以便脚本 returns 到启动器以启动更多脚本?
编辑 2
将subprocess.call(command)
替换为subprocess.Popen(command)
问题解决
不过我注意到一件事,如果我说 ps ax | grep mc.py
,PID 似乎完全不同。我认为我不在乎,因为我可以用 killall
.
轻松杀死他们
[更正]用pkill -f xxx.py
杀死他们
从脚本启动脚本有多种选择。最简单的可能是使用 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 之外没有任何共享。
我有 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个)。我如何修改启动器程序说 "run the launched script in background" 以便脚本 returns 到启动器以启动更多脚本?
编辑 2
将subprocess.call(command)
替换为subprocess.Popen(command)
不过我注意到一件事,如果我说 ps ax | grep mc.py
,PID 似乎完全不同。我认为我不在乎,因为我可以用 killall
.
[更正]用pkill -f xxx.py
从脚本启动脚本有多种选择。最简单的可能是使用 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 之外没有任何共享。