我有这个脚本,它应该从我的脚本启动简单的服务器:
import subprocess
cmd_line = "python -m SimpleHTTPServer 8000"
p = subprocess.Popen(cmd_line, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
out = p.communicate()[0]
print out
但我总是得到这个错误:
CTraceback (most recent call last): File "startserver.py", line 5, in <module>
out = p.communicate()[0]
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 790, in communicate
stdout = _eintr_retry_call(self.stdout.read)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 476, in _eintr_retry_call
return func(*args)
KeyboardInterrupt
答案 0 :(得分:3)
您正在中断程序,该命令启动一个服务器,因此使用communicate将不会输出,因为数据被缓冲并且通信将等到进程完成,您只看到输出{{ 1}}当你停止代码运行时。
如果您启动服务器并转到KeyboardInterrupt
,您会看到它正在运行。
如果您希望实时查看启动消息和输出,请http://127.0.0.1:8000/
使用iter
并删除通信:
stdout.readline
除非您抓住p = subprocess.Popen(['python', '-m', 'SimpleHTTPServer', '8000'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT,universal_newlines=True)
for line in iter(p.stdout.readline,""):
print(line)
,否则在您手动停止代码时仍会输出一个。