1

在使用 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

然而,从 shell 中快速检查 (>>> os.system("ps -e")) 会发现每个运行的 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

任何人都可以根据底层系统进程来解释这个(看似)奇怪的行为吗?也就是说,这些会话是并行运行还是在彼此内部运行?

抱歉,如果这个问题以前出现过,但我不确定其他人可能会如何提出它。

4

3 回答 3

4

当您使用os.system时,它会在子shell 中执行命令,例如/bin/sh -c 'yourcommand'*. 因此,你会得到你描述的行为是完全明智的。这与运行没有什么不同:

/bin/sh -c 'python'

在任何外壳中。

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

于 2016-01-27T16:17:08.920 回答
3

根据以下文档os.system()

在子shell 中执行命令(字符串)。

os.system()fork,执行一个子shell,将参数传递给这个子shell并等待子shell退出。

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

- python
\-- sh
  \-- python
    \-- sh
      \-- python
于 2016-01-27T16:17:36.843 回答
0

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

于 2016-01-27T16:17:13.633 回答