Подпроцесс Python.Popen () и источник - PullRequest
4 голосов
/ 10 января 2010

Сторонний скрипт Python 2.5, который я пытаюсь отладить, поставил меня в тупик. Соответствующая часть сценария:

       proc = subprocess.Popen(
               "ls && source houdini_setup",
               shell = True,
               executable = "/bin/bash",
               )

Существует демон, который прослушивает порт 5001 и запускает приведенный выше сценарий. При запуске сценария происходит сбой со следующей ошибкой:

_cygwin.py
houdini_setup
... (more files) ...
/bin/sh: line 0: source: houdini_setup: file not found

Существует очень много файлов houdini_setup, как показано в ls, и на самом деле, если я изменю «source» на «cat» в приведенном выше сценарии, сценарий распечатывает содержимое houdini_setup, как и ожидалось. Более того, выполнение вышеуказанной команды в добросовестной оболочке bash также позволяет получить файл без жалоб.

Кто-нибудь знает, что здесь происходит?

Ответы [ 3 ]

7 голосов
/ 11 января 2010

source использует $PATH, чтобы найти то, что вы передаете ему, если вы не указали каталог. Попробуйте source ./houdini_setup.

2 голосов
/ 11 января 2010

Вы можете использовать strace для диагностики подобных проблем. В этом случае запуск его с флагом -ff для отслеживания подпроцесса показал бы, что ваш код ищет «houdini_setup» в неправильном месте:

stat64("/usr/local/bin/houdini_setup", 0xbf989e60) = -1 ENOENT (No such file or directory)
stat64("/usr/bin/houdini_setup", 0xbf989e60) = -1 ENOENT (No such file or directory)
stat64("/bin/houdini_setup", 0xbf989e60) = -1 ENOENT (No such file or directory)

Это могло бы побудить вас проверить документацию для встроенного source.

0 голосов
/ 07 декабря 2012

Может быть, вы можете просто использовать сам bash, если он доступен в вашей системе:

os.popen("/bin/bash -l -c 'source $HOME/.yourfiletobesourced'")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...