2011-06-14 72 views
0

这里有两个(相关的?)问题。当Popen调用并写入标准输入时Python出现奇怪的行为

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

这是我得到了什么,当我跑它:

[email protected]:testing$ python send.py 
[email protected]: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 

它看起来像whatev呃理由input()的结果被视为线的一部分,而不是字符串,事实上当我在recv.py中设置变量Hello时,它打印的内容为Hello。为什么会发生这种情况?(2)

我在Mac OSX上运行python 3.1.2。

+0

也许为了鼓励对(1)的回答,你应该提供一个更清晰的代码描述 - 也许有特定的例子。 – chisaipete 2011-06-15 00:07:42

回答

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代替运行。

+0

你知道吗,我敢打赌'python'是我的'.profile'中的一个别名,我们可以假设'Popen'没有遵循我的别名。 – Violet 2011-06-14 23:34:02

2

请确定您的实际上是运行Python 3?这看起来很像Python 2.x input()行为,它将输入解释为Python表达式(而不是raw_input(),它变成了Python 3的input())。

+1

d'oh,'python'是'python3.1'的别名,但Popen不会跟随该别名。 – Violet 2011-06-14 23:35:22

相关问题