替换不启动新子进程的 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
直接调用流程构造函数,其中命令作为列表传递,您可以将 stdout
、stderr
值设置为 PIPE
并调用comunicate()
获取输出。
在 Python 3.5 中添加 subprocess.run
作为 subprocess.Popen
的简化。它们之间的主要区别在于 run
执行命令并等待它完成,而使用 Popen
您可以在进程完成时继续执行操作,然后只需调用 comunicate
我有一个 运行 持续运行的 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
直接调用流程构造函数,其中命令作为列表传递,您可以将 stdout
、stderr
值设置为 PIPE
并调用comunicate()
获取输出。
在 Python 3.5 中添加 subprocess.run
作为 subprocess.Popen
的简化。它们之间的主要区别在于 run
执行命令并等待它完成,而使用 Popen
您可以在进程完成时继续执行操作,然后只需调用 comunicate