subprocess.Popen()和os.fork()有什么区别?

时间:2018-04-03 10:37:05

标签: python fork

似乎subprocess.Popen()os.fork()都可以创建子进程。但我想知道两者之间的区别。你什么时候使用哪一个?我试着查看他们的源代码,但是我无法在我的机器上找到fork()的源代码,并且不完全清楚Popen如何在Unix机器上工作。

有人可以详细说明吗?

由于

3 个答案:

答案 0 :(得分:5)

subprocess.Popen让你在自己的进程中执行任意程序/命令/可执行文件。

os.fork只允许您创建一个子进程,该进程将从您调用它的确切行执行相同的脚本。顾名思义,它只是"简单地说#34;将当前流程分成2个。

os.fork仅适用于Unix,subprocess.Popen是跨平台的。

答案 1 :(得分:1)

所以我为你阅读了这些文档。结果:

  • os.fork仅存在于Unix上。它创建了一个子进程(通过克隆现有进程),但就是这样。当它返回时,你有两个(大多数)相同的进程,都运行相同的代码,都从os.fork返回(但是新进程从0得到os.fork而父进程得到了子进程的PID)。

  • subprocess.Popen更具可移植性(特别适用于Windows)。它创建一个子进程,但是您必须指定子进程应该执行的另一个程序。在Unix上,它通过调用os.fork(克隆父进程),然后os.execvp(将程序加载到新的子进程)来实现。因为Popen是关于执行程序的,所以它允许您自定义程序的初始环境。您可以重定向其标准句柄,指定命令行参数,覆盖环境变量,设置其工作目录等。这些都不适用于os.fork

通常,subprocess.Popen使用起来更方便。如果你使用os.fork,你需要手动处理很多东西,它只能在Unix系统上运行。另一方面,如果你真的想要克隆一个进程而执行一个新程序,那么os.fork就是你的选择。

答案 2 :(得分:-1)

Subprocess.popen()会产生新的操作系统级别进程。

os.fork()创建另一个进程,该进程将在与此进程完全相同的位置恢复。所以在第一次循环运行中,你得到一个fork,之后你有两个进程,"原来的一个" (它获取子进程的PID的pid值)和分叉的(获得pid值为0)。