当由Popen调用并写入stdin时,Python出现奇怪的行为

问题描述

| 这里有两个(相关的?)问题。 我试图编写一个程序来启动外部过程,然后同时从stdout读取并写入stdin。一切似乎都正常,但是该进程没有响应发送到其stdin管道的数据。你知道为什么会这样吗?(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
看起来无论出于何种原因,都将
input()
的结果视为行的一部分而不是字符串,实际上,当我在recv.py中设置变量
Hello
时,它打印了
Hello
内容。为什么会这样呢?(2) 我在Mac OSX上运行python 3.1.2。     

解决方法

        您所看到的是Python 2.x的
input()
函数的预期行为,该函数从
sys.stdin
(如
raw_input()
)中提取一行,然后将其评估为Python代码。在Python 2.x中使用
input()
通常是个坏主意:)在Python 3.x中,删除了
input()
并将
raw_input()
重命名为
input()
,这可能就是为什么您对它的作用感到困惑的原因。 即使您已经安装了Python 3.x,也不会执行它。
python
命令可能(还是希望!)仍然是系统安装的Python2.x。尝试使用
python3
python3.1
运行它。     ,        确保您实际上正在运行Python 3?这看起来像可疑的Python 2.x
input()
行为,它将输入解释为Python表达式(而不是
raw_input()
变成了Python 3 \的
input()
)。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...