2010-08-11 11 views
7

Vấn đề tôi gặp phải là với Eclipse/PyCharm giải thích kết quả của Popen() khác với một terminal chuẩn. Tất cả đang sử dụng python2.6.1 trên OSX.subprocess.Popen() có hành vi không nhất quán giữa Eclipse/PyCharm và thực thi terminal

Dưới đây là một ví dụ kịch bản đơn giản:

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 

Với một thiết bị đầu cuối tiêu chuẩn, dòng:

ret = p.communicate() 

mang lại cho tôi:

(Pdb) print ret 
('/usr/local/bin/git\n', '') 

Eclipse và PyCharm cho tôi một tuple trống :

ret = {tuple} ('','') 

Thay đổi giá trị shell = cũng không giải quyết được sự cố. Trên terminal, thiết lập shell = True và truyền lệnh hoàn toàn (ví dụ, args = ["/ usr/bin/git"]) cho tôi kết quả tương tự: ret = ('/ usr/local/bin/git \ n ',' '). Và Eclipse/PyCharm đều cho tôi một tuple rỗng.

Bất kỳ ý tưởng nào về những gì tôi có thể làm sai?

Trả lời

14

Ok, đã tìm thấy sự cố và đó là điều quan trọng cần lưu ý khi sử dụng IDE trong môi trường kiểu Unix. IDE hoạt động theo một bối cảnh môi trường khác với người dùng cuối (duh, phải không?). Tôi đã không xem xét rằng các subprocess đã được sử dụng một môi trường khác với bối cảnh mà tôi có cho thiết bị đầu cuối của tôi (terminal của tôi đã bash_profile thiết lập để có nhiều thứ trong PATH).

này có thể dễ dàng kiểm tra bằng cách thay đổi kịch bản như sau:

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 

Theo nhà ga, con đường includes/usr/local/bin. Theo IDE nó không!

Đây là một bản ghi nhớ quan trọng đối với tôi - luôn nhớ về môi trường!

+0

Ồ, tôi vừa gặp sự cố tương tự trong Windows và bạn đã chỉ cho tôi đúng hướng! Cảm ơn. Một trình thông dịch được khởi chạy từ giao diện điều khiển có quyền truy cập vào cả hai biến "hệ thống" và "người dùng hiện tại" $ PATH, trong khi trình thông dịch hoặc chương trình được khởi chạy từ IDE hoặc Explorer chỉ có quyền truy cập vào "hệ thống" $ PATH. –

+0

Giải pháp để làm cho Eclipse bao gồm tất cả các ngữ cảnh có sẵn từ thiết bị đầu cuối là gì? Cảm ơn! – Tarelli