运行 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
在 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