在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
任何人都可以根据底层系统流程解释这个(貌似)奇怪的行为吗?也就是说,这些会话是并行运行还是彼此运行?
如果此问题出现之前已经道歉,但我不确定其他人是如何提出这个问题的。
答案 0 :(得分:4)
当您使用os.system
时performs 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
。