Python解释器中的解释器
1 个回答
我会尽量简单明了地说明如何重现这个问题,这样你就能看到冲突的情况。
python
import os; os.getpid();
# 我们需要这个,把它复制到剪贴板或者其他地方296236
# 对我来说是这个import subprocess
subprocess.Popen('python')
<subprocess.Popen object at somewhere_over_the_rainbow>
# 这个对象被创建了,Python可能在等着把它作为命令“python”推送到控制台
>>>
<import&get pid>
296236
# 命令被推送,新的进程被生成
你在当前打开的控制台中又启动了一个Python进程,而这个控制台已经在等待输入。这个“子”进程现在存在,但仍然不能要求输入,因为主进程还在“轮流”。想象一下这就像排队。对于import os;os.getpid()
的输出,现在仍然是主进程的PID,而现在子进程轮到它了。
<import&get pid>
296236
>>> Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)] on win32 输入“help”、“copyright”、“credits”或“license”以获取更多信息。
# 这是第二个进程的输出,它在轮到它的时候做了它的事情,现在主进程想要发言了
<import&get pid>
# 在主进程中
296236
<import&get pid>
# 在第二个进程中
296800
<import&get pid>
# 在主进程中
296236
<import&get pid>
# 在第二个进程中
296800
...这样交替进行。真正有趣的是当你想要exit()
时,因为输入的争夺仍在继续:
import os;os.getpid();exit()
# 在第二个进程中
296800
然后是一个干净的空行
import os;os.getpid();exit()
# 在主进程中
296236
C:\some folder>
基本上,这是因为你在做一些愚蠢的事情,导致它们在排队争夺输入操作。如果你需要使用它,最好是解释一个文件,而不是在已经打开的解释器中,而是在一个单独的文件中。例如:
main.py
import subprocess
subprocess.Popen('python other.py')
other.py
print('hello')
exit()
console
python main.py