我在MacOS 10.7.4上使用Python 2.7。這是一個較長的腳本(不是我寫的)的一部分,它基本上爲PHP提供了一些配置選項,將它們寫入PHP的stdin,然後從它的stdout中讀取它們。無法使用Python對stdin/stdout進行讀寫操作
實際上,我似乎無法從標準輸出讀取。下面的腳本應該寫'hello world',但是它寫的只是一個空行。
任何人都可以提出什麼問題?我對stdin
和stdout
的工作方式並不熟悉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。
你應該使用'Popen.communicate',這樣會簡單得多,並自動避免死鎖。答案中已經指出了真正的問題。 – schlamar 2012-07-19 12:02:42