运行 Python interpreter inside Python interpreter: 解释行为

Running Python interpreter inside Python interpreter: Explain behavior

在 python 解释器中使用 OS 模块时(运行 在 Linux 系统上的 shell 中),我注意到了它可以执行以下操作:

>>> os.system("python") #execute run python command in enclosing shell

生成以下输出,表示一个新的 python REPL 会话:

Python 2.7.9 (default, Apr  2 2015, 15:34:55) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> #*blinking cursor*

从这里,可以再次进行系统调用以启动 Python 的新会话,从中我可以再次进行系统调用等。这些 Python 环境似乎是独立的彼此之间的变量不在会话之间共享,并且系统调用被同等对待。

这些会话似乎 运行 彼此内部,至少在某种程度上,而不是并行,正如 quit() 函数的结果所证明的那样:

>>> os.system("python")
Python 2.7.9 (default, Apr  2 2015, 15:34:55) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()
0
>>> quit()
0
>>> quit()
0
>>> quit()
shaked@shaked-ThinkPad-X220:~/Desktop$ python

然而,快速检查 (>>> os.system("ps -e")) 来自 shell 的正在进行的进程揭示了每个 python 解释器的新 sh 运行宁:

11802 ?        00:00:00 kworker/u16:0
11803 pts/3    00:00:00 sh
11804 pts/3    00:00:00 python
11806 pts/3    00:00:00 sh
11807 pts/3    00:00:00 python
11810 pts/3    00:00:00 sh
11811 pts/3    00:00:00 python
11813 pts/3    00:00:00 sh
11814 pts/3    00:00:00 ps

谁能从底层系统进程的角度解释这种(看似)奇怪的行为?也就是说,这些会话 运行 是并行进行的还是彼此内部进行的?

如果这个问题以前出现过,我深表歉意,但我不确定其他人是如何提出这个问题的。

当您使用 os.system 时,它 performs the command in a subshell,类似于 /bin/sh -c 'yourcommand'*。因此,你会得到你所描述的行为是完全明智的。它与 运行:

没有区别
/bin/sh -c 'python'

任意 shell.

*Windows 略有不同,请阅读文档。

Python的os.system启动了一个新的系统进程。当您将 "python" 传递给它时,它会启动 一个新的 Python 解释器 ,它独立于调用 os.system 的解释器。

根据 os.system() 的文档:

Execute the command (a string) in a subshell.

os.system() 分叉,执行子 shell 将参数传递给此子 shell 并等待子 shell 退出。

子shell执行命令并等待它终止,因此进程树是:

- python
\-- sh
  \-- python
    \-- sh
      \-- python