Popen& P调用时奇怪的Python行为写给斯坦丁

时间:2011-06-14 23:27:56

标签: python stdout stdin identifier

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

我试图编写一个程序来启动一个外部进程,然后simultaniouly从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。

2 个答案:

答案 0 :(得分:3)

您所看到的是Python 2.x的input()函数的预期行为,该函数从sys.stdin开始(如raw_input()),然后将其评估为Python代码。在Python 2.x中使用input()通常是一个坏主意:)在Python 3.x中,input()被删除,raw_input()被重命名为input(),这可能是为什么你对它的作用感到困惑。

你没有执行Python 3.x,即使你已经安装了它。 python命令可能(希望!)仍然是系统安装的Python 2.x.请尝试使用python3python3.1来运行它。

答案 1 :(得分:2)

确保您实际运行Python 3?这看起来很像Python 2.x input()行为,它将输入解释为Python表达式(而不是成为Python 3 raw_input()的{​​{1}})。