2010-01-10 2 views
4

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

 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, как показано в л и в самом деле, если я изменю «источник» на «кошку» в сценарии выше , сценарий печатает содержимое houdini_setup, как ожидалось. Более того, выполнение точной приведенной выше команды в bona-fide shell bash также приводит к тому, что файл не содержит никаких жалоб.

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

+0

Я считаю возникновение нулевой странной – Mauli

+0

я копировать-вставить его из кода я пытаюсь отлаживать; удаление строки 'stdin = null; ', к сожалению, не имеет значения. – user168715

ответ

7

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

+0

Это трюк, спасибо! В реальной оболочке bash источнику не требуется ./ для файлов в текущем каталоге, даже если $ PATH не включает указанную директорию. Любая идея, почему это необходимо в Popen()? – user168715

+0

Возможно, это связано с тем, что выполнение оболочки было фактически sh, а не bash, несмотря на то, что строка передана вызову функции. – LeafStorm

+0

Это был мой опыт, что он * необходим. Всегда. –

2

Вы можете использовать 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

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

os.popen("/bin/bash -l -c 'source $HOME/.yourfiletobesourced'") 
+1

Вы должны использовать модуль 'subprocess' для этого (с установленным набором' shell = True'). –

Смежные вопросы