我遇到的问题是 Eclipse/PyCharm 以不同于标准终端的方式解释子进程的 Popen() 的结果。所有人都在 OSX 上使用 python2.6.1。
这是一个简单的示例脚本:
import subprocess
args = ["/usr/bin/which", "git"]
print "Will execute %s" % " ".join(args)
try:
p = subprocess.Popen(["/usr/bin/which", "git"], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# tuple of StdOut, StdErr is the responses, so ..
ret = p.communicate()
if ret[0] == '' and ret[1] <> '':
msg = "cmd %s failed: %s" % (fullcmd, ret[1])
if fail_on_error:
raise NameError(msg)
except OSError, e:
print >>sys.stderr, "Execution failed:", e
使用标准终端,线路:
ret = p.communicate()
给我:
(Pdb) print ret
('/usr/local/bin/git\n', '')
Eclipse 和 PyCharm 给了我一个空元组:
ret = {tuple} ('','')
更改 shell= 值也不能解决问题。在终端上,设置 shell=True,并完全传递命令(即 args=["/usr/bin/which git"])给我同样的结果:ret = ('/usr/local/bin/git \n', '')。Eclipse/PyCharm 都给了我一个空元组。
关于我可能做错了什么的任何想法?