Python:生成另一个程序

6

我有一个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个回答

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

子进程模块提供了更强大的创建新进程和检索结果的功能;使用该模块比使用此函数更可取。

然而,subprocess.Popen可能不是你要找的。与os.system相反,你将创建一个对应于子进程的Popen对象,并且必须等待它完成,例如:
proc = subprocess.Popen(["python3", "-u", "sub-program.py"])

do_something()

res = proc.wait()

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


我不想等待,我希望它能独立运行,这样主程序就可以进行其他任务了。 - user4588415
仅使用我上面示例中的代码,它不会等待,这正是我想要的。我提到的“可选附加功能”可以在另一天考虑... - user4588415

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表示输出到上述文本文件。

0

有没有特别的原因必须要用另一个程序呢?为什么不只是生成另一个进程,运行你脚本中定义的函数之一呢?

我建议你了解一下 multiprocessing。Python 有专门的模块:https://docs.python.org/dev/library/multiprocessing.html

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

但请注意,如果你想真正加速文件处理,你需要使用进程而不是线程(由于 Python 的一些限制,线程只会让你变慢,这很令人困惑)。

还要看看这个页面:https://pymotw.com/2/multiprocessing/basics.html 它有一些代码示例,会对你有很大帮助。 别忘了在你的脚本中加上这个保护:

if __name__ == '__main__':

这非常重要;)


谢谢您的评论,但它们大多数超出了我的理解范围!1 “有没有特别的原因…” 我不太明白这个,我想你是说我可以在主程序中异步运行某些东西。2 “我建议你阅读一下” 恐怕我甚至没有理解那份文件的第一段。3 “请注意” 我没有将其作为要求,但我想我知道你的意思。 - user4588415
那么,我是否可以得出以下结论:
  1. 我不需要单独的程序,可以在主程序中完成我想要的事情。
  2. 我应该使用“进程”而不是线程。 请问这种方法叫什么名字,如何确保它使用的是进程而不是线程?如果您能告诉我,我将能够指导我的研究,而不是学习所有不同类型的多进程技术。
- user4588415
(1) 是的,和 (3) 是的。我可能给了你非常模糊的建议,所以这里有一个资源,希望能帮到你:https://pymotw.com/2/multiprocessing/basics.html,在这里你会找到一些代码示例,几乎可以满足你的需求。但请注意:多进程/多线程是相当高级的主题。 - MarengoHue
谢谢,这看起来像是一个我可以理解的入门级别,只需要花费一些努力。在“回答于1月22日21:21”的方法中有效,唯一缺少的是能够在子进程完成任务时发送消息回来的能力。我想你推荐的多进程应该能够做到,但我正在使用一个内置等待用户输入的Glade GUI循环。我想知道它是否能够接收这些消息。听起来越来越复杂了。 - user4588415
如果该方法有效,您应将其标记为答案。(在左侧打勾) - MarengoHue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接