启动单个 python 脚本作为不同的进程,不同的命令行参数

Posted

技术标签:

【中文标题】启动单个 python 脚本作为不同的进程,不同的命令行参数【英文标题】:Launch a single python script as different processes differing by command line arguments 【发布时间】:2016-04-08 20:08:38 【问题描述】:

我有接受命令行参数的 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杀死他们

【问题讨论】:

你可能想要多进程而不是子进程docs.python.org/3/library/multiprocessing.html 这些不是在自己的进程上运行吗? 是的,但是课程的马,如果你想运行和控制多个进程,那么使用多处理,因此得名。 嗯,它能给我带来什么? 这些脚本不交流也不共享任何东西。 【参考方案1】:

从脚本启动脚本有多种选择。最简单的可能是使用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 之外什么都不共享。

【讨论】:

我给了你荣誉,因为你回答了我的问题。请参阅编辑 1 了解未预料到的问题。 我发现了Popen。 调用块,这样你就不会运行一个进程,直到前一个进程返回 情况似乎并非如此。请参阅编辑 2。 Popen 肯定会工作。但作为对阅读此问题的其他人的说明,os.system() 只需在命令末尾添加 & 即可。在 UNIX/LINUX/类 UNIX 系统上,& 在后台运行一个进程。例如尝试 os.system('sleep 3')os.system('sleep 3 &')

以上是关于启动单个 python 脚本作为不同的进程,不同的命令行参数的主要内容,如果未能解决你的问题,请参考以下文章

在python中恢复具有不同输入的进程或重新启动它是否更好?

python脚本的守护进程与新贵

以与长时间运行的 Python 进程不同的用户身份运行子进程

在 ASP.NET 中以不同用户身份启动进程

“lxd”与 lxc/docker 有何不同?

将由所有进程传播的数组的不同部分放入单个最终数组中的更好方法,在 C 中使用 MPI