启动单个 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

杀死他们

从脚本启动脚本有多种选择。最简单的可能是使用 subprocessos 模块。

我已经多次执行此操作以启动集群上的独立节点。使用 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 之外没有任何共享。