Python在被Popen&;调用时的奇怪行为;写信给stdin
这里有两个(相关的?)问题 我试图编写一个程序来启动一个外部进程,然后同时从标准输出读取数据并写入标准输入。一切似乎都在运行,但进程没有对发送到其标准输入管道的数据做出响应。你知道为什么会这样吗?(1) 第二个问题现在已经解决。 我编写了两个测试脚本,第一个是这样的:Python在被Popen&;调用时的奇怪行为;写信给stdin,python,stdout,stdin,identifier,Python,Stdout,Stdin,Identifier,这里有两个(相关的?)问题 我试图编写一个程序来启动一个外部进程,然后同时从标准输出读取数据并写入标准输入。一切似乎都在运行,但进程没有对发送到其标准输入管道的数据做出响应。你知道为什么会这样吗?(1) 第二个问题现在已经解决。 我编写了两个测试脚本,第一个是这样的: # recv.py while True: print(input()) 第二个用于使用Popen调用另一个,为其提供一些任意输入: # send.py recv = subprocess.Popen(["python"
# recv.py
while True:
print(input())
第二个用于使用Popen调用另一个,为其提供一些任意输入:
# send.py
recv = subprocess.Popen(["python", "recv.py"], stdin=subprocess.PIPE)
recv.stdin.write(b"Hello\n")
recv.stdin.write(b"World.\n")
这是我运行它时得到的:
skyler@pro:testing$ python send.py
skyler@pro:testing$ Traceback (most recent call last):
File "recv.py", line 30, in <module>
main()
File "recv.py", line 26, in main
print(input())
File "<string>", line 1, in <module>
NameError: name 'Hello' is not defined
skyler@pro:测试$python send.py
skyler@pro:正在测试$Traceback(最近一次呼叫最后一次):
文件“recv.py”,第30行,在
main()
文件“recv.py”,第26行,主
打印(输入())
文件“”,第1行,在
NameError:未定义名称“Hello”
无论出于何种原因,input()
的结果被视为行的一部分,而不是字符串,事实上,当我在recv.py中设置变量Hello
时,它打印了Hello
的内容。为什么会发生这种情况?(2)
我正在Mac OSX上运行Python3.1.2。您看到的是Python2.x的
input()
函数的预期行为,它从sys.stdin
(如raw\u input()
)中获取一行代码,然后将其作为python代码进行计算。在Python2.x:)中使用input()
通常是一个坏主意,在Python3.x中,input()
被删除,而raw\u input()
被重命名为input()
,这可能是您对它的功能感到困惑的原因
您没有执行Python3.x,即使您可能已经安装了它。
python
命令可能(希望如此!)仍然是系统安装的python2.x。请尝试使用python3
或python3.1
运行它。您看到的是Python2.x的input()
函数的预期行为,该函数从sys.stdin
中提取一行代码(如raw\u input()
),然后将其作为Python代码进行计算。在Python2.x:)中使用input()
通常是一个坏主意,在Python3.x中,input()
被删除,而raw\u input()
被重命名为input()
,这可能是您对它的功能感到困惑的原因
您没有执行Python3.x,即使您可能已经安装了它。
python
命令可能(希望如此!)仍然是系统安装的python2.x。请尝试使用python3
或python3.1
运行它。确保您实际运行的是python3?这看起来很像Python2.x的input()
行为,它将输入解释为Python表达式(而不是raw\u input()
,后者成为Python3的input()
)?这看起来很像Python2.x的input()
行为,它将输入解释为Python表达式(而不是raw\u input()
,后者成为Python3的input()
),我们可以假设Popen
不跟随我的别名。你知道吗,我打赌python
在我的.profile
中是一个别名,我们可以假设Popen
不跟随我的别名。d'oh,'python'是'python3.1'的别名,但Popen不会跟随这个别名。d'oh,'python'是'python3.1'的别名,但是Popen不会使用这个别名。也许为了鼓励回答(1)你应该提供一个更清晰的代码描述——也许有具体的例子。也许为了鼓励回答(1)你应该提供一个更清晰的代码描述——也许有具体的例子。