Python: 生成另一个程序

Python: Spawning another program

我有一个 Python 程序,我从中生成一个子程序来处理一些文件,而无需阻止主程序。我目前正在为子程序使用 bash,从一个命令和两个参数开始,如下所示:

result = os.system('sub-program.sh file.txt file.txt &')

效果很好,但我(最终!)意识到我可以将 Python 用于子程序,这会更可取,所以我转换了它。生成它的最简单方法可能是:

result = os.system('python3 sub-program.py file.txt file.txt &')

一些研究显示了几种更复杂的替代方法,但我的印象是最新和最受认可的方法是这个:

subprocess.Popen(["python3", "-u", "sub-program.py"])

我认为这是最合适的做法对吗?有人会推荐一种不同的方法吗?为什么?简单就好,因为我有点 Python 新手。

如果这是推荐的方法,我大概可以弄清楚“-u”的作用以及如何为自己添加参数。

可选附加项:

是否有任何特殊原因必须完全是另一个程序?为什么不生成另一个运行脚本中定义的函数之一的进程?

我建议您阅读多处理。 Python 有专门的模块:https://docs.python.org/dev/library/multiprocessing.html

在这里您可以找到关于生成新进程、它们之间的通信和同步它们的信息。

请注意,如果您想真正加快文件处理速度,您需要使用 processes 而不是 threads(由于 python 中的一些限制,线程只会减慢你的速度,这令人困惑。

另请查看此页面:https://pymotw.com/2/multiprocessing/basics.html 它有一些代码示例,可以帮助您很多。 不要忘记脚本中的这个守卫:

if __name__ == '__main__':

非常重要;)

是的,根据文档,使用 subprocess 是推荐的方法:

The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function.

但是,subprocess.Popen 可能不是您要查找的内容。与 os.system 相反,您将创建一个对应于子流程的 Popen 对象,您必须 wait 才能等待它完成,fx:

proc = subprocess.Popen(["python3", "-u", "sub-program.py"])

do_something()

res = proc.wait()

如果您只想 运行 一个程序并等待完成,您应该使用 subprocess.run(或者 subprocess.callsubprocess.check_callsubprocess.check_output ) 代替。

谢谢skyking!

import subprocess

在主程序的开头,这就是我想要的:

with open('output.txt', 'w') as f:   
  subprocess.Popen([spawned.py, parameter1, parameter2], stdout = f)

第一行为第二行开始的 sub-program 的输出打开一个文件。在第二行中,方括号包含 sub-program 的内容 - 名称后跟两个参数。 sys.argv[1] 和 sys.argv[2] 中的 sub-program 中提供了这些参数。之后是子进程参数 - f 表示输出到上面提到的文本文件。