2010-08-11 17 views
7

我遇到的问题是Eclipse/PyCharm不同于标准终端解释子进程的Popen()的结果。所有人都在OSX上使用python2.6.1。subprocess.Popen()在Eclipse/PyCharm和终端执行之间的行为不一致

这里有一个简单的示例脚本:

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都给了我一个空元组。

关于我可能做错什么的想法?

回答

14

好的,发现这个问题,在Unix类型的环境中使用IDE时需要记住一件重要的事情。 IDE在与终端用户不同的环境下运行(duh,right ?!)。我没有考虑子进程使用的环境不同于我的终端环境(我的终端有bash_profile设置PATH中有更多的东西)。

这很容易通过改变脚本如下验证:

import subprocess 
args = ["/usr/bin/which", "git"] 
print "Current path is %s" % os.path.expandvars("$PATH") 
try: 
    p = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    # tuple of StdOut, StdErr is the responses, so .. 
    out, err = p.communicate() 
    if err: 
    msg = "cmd %s failed: %s" % (fullcmd, err) 
except OSError, e: 
    print >>sys.stderr, "Execution failed:", e 

下的终端,所述路径包括在/ usr/local/bin中。在IDE下它不会!

这对我来说很重要 - 永远记住环境!

+0

哇,我刚刚在Windows下有同样的问题,你指出我在正确的方向!谢谢。从控制台启动的解释器可以访问“系统”和“当前用户”$ PATH变量,而从IDE或Explorer启动的解释器或程序只能访问“系统”$ PATH。 – 2013-08-19 09:04:48

+0

什么解决方案让Eclipse包含终端提供的所有上下文?谢谢! – Tarelli 2014-09-26 12:23:27

相关问题