在Python解释器中运行Python解释器:解释行为

时间:2016-01-27 16:12:08

标签: python linux shell python-os

在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

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

如果此问题出现之前已经道歉,但我不确定其他人是如何提出这个问题的。

3 个答案:

答案 0 :(得分:4)

当您使用os.systemperforms the command in a subshell,类似/bin/sh -c 'yourcommand' *。因此,你会得到你描述的行为是完全明智的。它与跑步没什么不同:

/bin/sh -c 'python'

在任何shell中。

*在Windows上有轻微差异,请阅读文档。

答案 1 :(得分:3)

根据os.system()的文档:

  

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

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

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

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

答案 2 :(得分:0)

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