我有一个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"我是如何以及如何为自己添加参数。
可选附加内容:
答案 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.call
,subprocess.check_call
或subprocess.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表示输出到上面提到的文本文件。