2012-07-19 75 views
1

我在MacOS 10.7.4上使用Python 2.7。這是一個較長的腳本(不是我寫的)的一部分,它基本上爲PHP提供了一些配置選項,將它們寫入PHP的stdin,然後從它的stdout中讀取它們。無法使用Python對stdin/stdout進行讀寫操作

實際上,我似乎無法從標準輸出讀取。下面的腳本應該寫'hello world',但是它寫的只是一個空行。

任何人都可以提出什麼問題?我對stdinstdout的工作方式並不熟悉Python,或者根本就不用PHP,所以我很努力去調試它。

php_path = '/usr/bin/php' 
args = [php_path] 
child = subprocess.Popen(args, 
     stdin=subprocess.PIPE, 
     stdout=subprocess.PIPE, 
     universal_newlines=True) 
# Write to PHP stdin 
print >>child.stdin, """ 
<?php 
print "hello world\n"; 
# In reality we'd write some configuration options here, 
# but in practice we can't even write 'hello world'. 
} 
?>""" 
child.stdin.close() 
# Read from PHP stdout 
line = True 
while line: 
    print 'line', line 
    line = child.stdout.readline() 
    print 'line from stdout', line 
    if line == "hello world\n": 
     break 
else: 
    raise Exception, "%s: failed to read options" % (php_path) 

的輸出是這樣的:

line True 
line from stdout 

line 

line from stdout Parse error: parse error in - on line 5 

line Parse error: parse error in - on line 5 

line from stdout 
Traceback (most recent call last): 
    File "test.py", line 25, in <module> 
    raise Exception, "%s: failed to read options" % (php_path) 
Exception: /usr/bin/php: failed to read options 

肯定是有在/usr/bin/php一個PHP。

+0

你應該使用'Popen.communicate',這樣會簡單得多,並自動避免死鎖。答案中已經指出了真正的問題。 – schlamar 2012-07-19 12:02:42

回答

1

你正在調試錯誤的東西。您將該字符串發送給PHP,並且您收到了PHP錯誤。 PHP對我的第5行抱怨解析錯誤。

現在 - 是一個特殊的文件名意思是標準輸入,所以它抱怨你發送它的第5行,這似乎是一個懸掛}

1

似乎有一個額外的花括號在PHP腳本的結尾,這可能會導致問題。