подпроцесс. Popen () имеет непоследовательное поведение между Eclipse/PyCharm и терминальным выполнением

Проблемой, которую я имею, является с Eclipse/PyCharm интерпретация результатов Popen подпроцесса () по-другому по сравнению со стандартным терминалом. Все используют python2.6.1 на OSX.

Вот простой сценарий в качестве примера:

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=True, и передавая команду в в целом (т.е. args = ["/usr/bin/which мерзавец"]) дает мне тот же результат: мочите = ('/usr/local/bin/git\n', ''). И Eclipse/PyCharm оба дают мне пустой кортеж.

Какие-либо идеи о том, что я мог делать неправильно?

8
задан cybertoast 11 August 2010 в 15:37
поделиться

1 ответ

Хорошо, проблема обнаружена, и об этом важно помнить при использовании IDE в среде типа Unix. IDE работают в другом контексте среды, чем пользователь терминала (да, верно ?!). Я не считал, что подпроцесс использует среду, отличную от контекста, который у меня есть для моего терминала (в моем терминале 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 этого нет!

Это важная проблема для меня - всегда помни об окружающей среде!

14
ответ дан 5 December 2019 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: