Python解释器中的解释器

3 投票
1 回答
1402 浏览
提问于 2025-05-17 17:01

我在学习Python的subprocess模块时,尝试在解释器里输入了subprocess.call("python"),结果在原来的解释器里又打开了一个新的解释器,这样一来就变得有点奇怪了。在输入的时候,我发现有些字符没有正确显示出来,我不得不重复输入几次。而且,按下回车键后,屏幕上出现的不仅仅是一些箭头符号。以下是部分输出的截图:

解释器中的解释器

有没有人能解释一下发生了什么?我知道这个问题可能有点宽泛或模糊,但我实在无法更具体地说明。

相关问题:

  • 暂无相关问题
暂无标签

1 个回答

2

我会尽量简单明了地说明如何重现这个问题,这样你就能看到冲突的情况。

  1. python
  2. import os; os.getpid(); # 我们需要这个,把它复制到剪贴板或者其他地方

    296236 # 对我来说是这个

  3. import subprocess

  4. subprocess.Popen('python')

<subprocess.Popen object at somewhere_over_the_rainbow> # 这个对象被创建了,Python可能在等着把它作为命令“python”推送到控制台

>>>

  1. <import&get pid>

296236 # 命令被推送,新的进程被生成

你在当前打开的控制台中又启动了一个Python进程,而这个控制台已经在等待输入。这个“子”进程现在存在,但仍然不能要求输入,因为主进程还在“轮流”。想象一下这就像排队。对于import os;os.getpid()的输出,现在仍然是主进程的PID,而现在子进程轮到它了。

  1. <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”以获取更多信息。 # 这是第二个进程的输出,它在轮到它的时候做了它的事情,现在主进程想要发言了

  1. <import&get pid> # 在主进程中

296236

  1. <import&get pid> # 在第二个进程中

296800

  1. <import&get pid> # 在主进程中

296236

  1. <import&get pid> # 在第二个进程中

296800

...这样交替进行。真正有趣的是当你想要exit()时,因为输入的争夺仍在继续:

  1. import os;os.getpid();exit() # 在第二个进程中

296800

然后是一个干净的空行

  1. 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

撰写回答