似乎subprocess.Popen()和os.fork()都可以创建子进程。但我想知道两者之间的区别。你什么时候使用哪一个?我试着查看他们的源代码,但是我无法在我的机器上找到fork()的源代码,并且不完全清楚Popen如何在Unix机器上工作。
有人可以详细说明吗?
由于
答案 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)。