所以我学习了Python subprocess
模块。在解释器的帮助下,我键入了subprocess.call("python")
,并在现有的解释器中打开了另一个解释器,事情变得非常奇怪。打字时,我注意到有些字符没有被正确回显,我不得不反复输入。此外,普通的Enters(或返回)在屏幕上添加的不仅仅是V形符号。这是输出的一部分:
有人可以解释发生了什么吗?我知道这个问题可能过于宽泛或含糊不清,但我无法在此具体说明。
答案 0 :(得分:1)
我会尽量让它重现,以便你能看到碰撞。
python
import os; os.getpid();
#我们需要这个,把它拿到剪贴板或其他东西
296236
#对我来说
import subprocess
subprocess.Popen('python')
<subprocess.Popen object at somewhere_over_the_rainbow>
#object被创建,python可能等待机会将其作为命令推送到控制台&#34; python&#34;
>>>
<import&get pid>
296236
#命令被推送,新进程产生
您将另一个Python进程生成到当前打开的控制台中,已经等待输入。 &#34;孩子&#34;过程现在存在,但仍然不能要求获得输入,因为主要的仍然是在转弯时#34;。想象它就像一个队列。 import os;os.getpid()
的输出现在仍然是主要流程&#39; 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 Type "help", "copyright", "credits" or "license" for more information.
#来自第二个流程,它反过来做了它的东西,现在主要流程想要谈谈
<import&get pid>
#
296236
<import&get pid>
#在第二个过程中
296800
<import&get pid>
#
296236
<import&get pid>
#in second process
296800
......并且一次又一次地交替。当您想要exit()
时,乐趣就开始了,因为对输入的争夺仍在继续:
import os;os.getpid();exit()
#in second process
296800
和干净的空行
import os;os.getpid();exit()
#in main process
296236
C:\some folder>
基本上它会为队列中的IO操作而战,因为你做了一些愚蠢的事情。如果您需要使用它,只需解释一个文件,绝对不是在已经打开的解释器中,而是在一个单独的文件中。例如:
<强> main.py 强>
import subprocess
subprocess.Popen('python other.py')
<强> other.py 强>
print('hello')
exit()
<强>控制台强>
python main.py