Python在被Popen&;调用时的奇怪行为;写信给stdin

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"

这里有两个(相关的?)问题

我试图编写一个程序来启动一个外部进程,然后同时从标准输出读取数据并写入标准输入。一切似乎都在运行,但进程没有对发送到其标准输入管道的数据做出响应。你知道为什么会这样吗?(1)

第二个问题现在已经解决。

我编写了两个测试脚本,第一个是这样的:

# 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)你应该提供一个更清晰的代码描述——也许有具体的例子。