替换不启动新子进程的 Popen

replacement for Popen that doesn't start new subprocess

我有一个 运行 持续运行的 ETL 进程,并且有多个使用 ProcessPoolExecutor 的子进程。在那个过程中我需要 运行 一些 bash 命令,直到现在我一直使用 os.system 因为我害怕在我的子进程中打开一个新的子进程,它导致我的过去有很多问题(我机器上的内存错误)。 任何替代 Popen 的想法,或者可以保证其打开子进程的方式不会造成伤害。

谢谢

不确定您到底需要什么,但也许以下信息会对您有所帮助:

所以基本上你有变体:

os.system("ls -l") 执行在子 shell ( os.system.__doc__ 'Execute the command in a subshell.')

中作为字符串传递的命令

subprocess.call(["ls","-l"])subprocess.call("ls -l", shell=True) 区别在于设置 shell=False 时,没有系统 shell 启动,因此第一个参数必须是可执行文件的路径文件,如果 shell=True 表示系统 shell 例如\bin\sh 将首先旋转起来。

subprocess.Popen 直接调用流程构造函数,其中命令作为列表传递,您可以将 stdoutstderr 值设置为 PIPE 并调用comunicate() 获取输出。

在 Python 3.5 中添加 subprocess.run 作为 subprocess.Popen 的简化。它们之间的主要区别在于 run 执行命令并等待它完成,而使用 Popen 您可以在进程完成时继续执行操作,然后只需调用 comunicate