Проблема подпроцесса Python 2.7–3.4

Я вызываю другую программу с фрагментом кода, который выглядит так:

import subprocess
lc="/package/bin/program --do stuff"
command_list = lc.split()
ljs=subprocess.Popen(command_list,stdout=subprocess.PIPE)
ljs.communicate()[0]

Строка отлично работает в командной строке UNIX, а код работает в Python 2.7. Но в Python 3.4 я получаю такую ​​ошибку:

File "/package/bin/program", line 2, in <module>
    from package import module
ImportError: No module named package

«/package/bin/program» здесь вызывает зависимость от другого файла в пакете, что, я думаю, является основной проблемой. У меня есть вызовы других программ, которые нормально работают в 3.4.

Что изменилось в 3.4, что может быть причиной этого?

(Заранее извините за загадочный код - я звоню внутренним инструментам компании, которые не могу раскрыть здесь).


person econgineer    schedule 05.12.2015    source источник
comment
Существует ли файл bin/program в текущем рабочем каталоге?   -  person falsetru    schedule 05.12.2015
comment
Я предполагаю, что bin/program - это приложение для Python 2.7? Возможно, в среде, которую вы передаете подпроцессу, есть что-то, что заставляет его искать модули в пути 3.4. Проверьте, что находится в os.environ, особенно PYTHONPATH. Вы также можете посмотреть на первую строку в bin/package, чтобы увидеть, указывает ли ее шебанг на правильный питон.   -  person tdelaney    schedule 05.12.2015
comment
О, и я полагаю, вы не делаете это в виртуальной среде?   -  person tdelaney    schedule 05.12.2015
comment
@falsetru нет, но я звоню по всему пути. Обновить пост.   -  person econgineer    schedule 05.12.2015
comment
@tdelaney, вы правы, целевое приложение 2.7. Позвольте мне вникнуть в это. Спасибо!   -  person econgineer    schedule 05.12.2015
comment
Вы можете написать тестовое приложение, которое заменяет program и просматривает модуль sys, чтобы увидеть такие вещи, как версия и что находится в sys.path.   -  person tdelaney    schedule 05.12.2015


Ответы (2)


Проблема в том, что рабочим каталогом экземпляра подпроцесса по умолчанию является каталог оболочки bash. Чтобы установить новый рабочий каталог, установите аргумент cwd в вашем Popen на ваш рабочий каталог.

Вот пример:

subprocess.Popen(['random' '--command'], stdout = subprocess.PIPE, cwd='C:/Path/To/Working/Directory/')
person Community    schedule 05.12.2015
comment
Проблема OP заключается в том, что program импортирует другие модули. Я не понимаю, как задействован текущий рабочий каталог. - person tdelaney; 05.12.2015
comment
@tdelaney Потому что, насколько я вижу, нет импорта, кроме как в Popen. Так что он должен запускать скрипт Python в Popen, и скрипт импортирует вещи. В таком случае... код, который он разместил, не имеет значения. - person ; 05.12.2015
comment
program импортирует вещи. Но независимо, cwd не участвует. - person tdelaney; 05.12.2015
comment
@tdelaney Итак, это означает, что мы не можем отлаживать, не заглянув в код компании, и что мой ответ не имеет значения. - person ; 05.12.2015

Комментарии выше были полезны при изучении проблемы, но, в конце концов, это похоже на конфликт разрешений — добавление sudo -u <user> до того, как команда устранит проблему. До сих пор не ясно, почему для Py3 это требуется, а для Py2 нет, но, возможно, мне нужно более внимательно изучить проблему с другими внутренними пользователями.

Спасибо!

person econgineer    schedule 05.12.2015