Python:产生另一个程序

时间:2016-01-22 17:09:02

标签: python spawn

我有一个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"我是如何以及如何为自己添加参数。

可选附加内容:

  • 从子程序向主程序发回消息。
  • 在主程序执行时退出子程序。

3 个答案:

答案 0 :(得分:1)

是的,根据文档建议使用subprocess

  

子流程模块提供了更强大的工具来生成新流程并检索其结果;使用该模块比使用此功能更可取。

但是,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)。

答案 1 :(得分:0)

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

我建议你阅读多处理。 Python只有那个模块:https://docs.python.org/dev/library/multiprocessing.html

在这里,您可以找到有关产生新流程,在它们之间进行通信以及同步它们的信息。

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

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

if __name__ == '__main__':

非常重要;)

答案 2 :(得分:0)

谢谢skyking!

import subprocess

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

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

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