启动单个 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】:从脚本启动脚本有多种选择。最简单的可能是使用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 之外什么都不共享。
【讨论】:
我给了你荣誉,因为你回答了我的问题。请参阅编辑 1 了解未预料到的问题。 我发现了Popen。 调用块,这样你就不会运行一个进程,直到前一个进程返回 情况似乎并非如此。请参阅编辑 2。 Popen 肯定会工作。但作为对阅读此问题的其他人的说明,os.system()
只需在命令末尾添加 &
即可。在 UNIX/LINUX/类 UNIX 系统上,&
在后台运行一个进程。例如尝试 os.system('sleep 3')
与 os.system('sleep 3 &')
以上是关于启动单个 python 脚本作为不同的进程,不同的命令行参数的主要内容,如果未能解决你的问题,请参考以下文章
在python中恢复具有不同输入的进程或重新启动它是否更好?