2016-01-27 50 views
1

虽然在Python解释器(内壳在Linux系统上运行)OS模块打打闹闹,我注意到它是可以做到以下几点:运行Python解释器的Python解释器:解释行为

>>> 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环境似乎与每个环境无关其他因素是变量不会在会话中共享,并且系统调用被等效处理。

这些会话似乎内部彼此运行,至少在一定程度上,而不是在平行,由退出()函数的结果所证实:

>>> 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() 
[email protected]:~/Desktop$ python 

然而,快速检查(> >>从外壳正在进行的过程中使用os.system(“PS -e”))揭示了一个新的SH每个Python解释器运行:

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 

任何人都可以在下面的方面解释(貌似)的奇怪行为系统进程?也就是说,这些会话是并行还是相互并行?

如果此问题出现之前道歉,但我不确定其他人可能如何呈现它。

+1

你究竟发现了什么奇怪的? – Alik

+0

没有什么奇怪的。 “os.system”被记录为创建一个新的进程(它使用术语“subshel​​l”)。创建新的流程正是它的目的。 –

+0

@Alik在他的评论中提供了一个很好的(如果是间接的)答案。这个问题的答案和许多其他os *问题是:Python几乎都遵循下面的libc。要看看'os.system'在Python中做了什么,[看看底层c lib的'system'调用是干什么的](http://code.metager.de/source/xref/gnu/glibc/sysdeps/posix/system 。C)。 – kojiro

回答

3

作为每os.system()文档:

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

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

子shell执行命令,并等待其终止,因此该方法树是:

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

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

/bin/sh -c 'python' 

在任何shell。

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

+1

它调用'system'系统调用,这个系统调用依次在大多数unix系统上运行'/ bin/sh -c'yourcommand'' – Alik

+0

@Alik right,但是如果Python文档以“in subshel​​l”开头,那么它是否值得在这里做出区别? – kojiro

0

Python's os.system启动一个新的系统进程。当你通过"python"到它,它启动一个新的Python解释器,这是独立于从一个os.system被调用。