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

tra*_*rad 3 python fork

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

有人可以详细说明吗?

谢谢

mel*_*ene 7

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

  • os.fork只存在于 Unix 上。它创建了一个子进程(通过克隆现有进程),但仅此而已。当它返回时,您有两个(大部分)相同的进程,都运行相同的代码,都从os.fork(但新进程0os.fork父进程获取子进程的PID)返回。

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

总的来说,subprocess.Popen使用起来比较方便。如果您使用os.fork,则需要手动处理很多,而且它只能在 Unix 系统上工作。另一方面,如果你真的想克隆一个进程而不是执行一个新程序,这os.fork是要走的路。

  • “所以我为你阅读了文档”,你的尖酸刻薄让你获得了赞成票。如果你有答案,请直接给出答案,不要带有讽刺意味。 (7认同)
  • @mypetlion 你在哪里看到讽刺? (6认同)
  • 我个人很欣赏人们为我阅读文档,甚至更多,如果他们提到它来自规范,我倾向于更多地依赖这样的答案。我可以改写为不包括讽刺般的介绍,但我确实喜欢这个答案,这对我很有用。 (4认同)

Dee*_*ace 5

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

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

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