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.call
、subprocess.check_call
或 subprocess.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 表示输出到上面提到的文本文件。
我有一个 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.call
、subprocess.check_call
或 subprocess.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 表示输出到上面提到的文本文件。