2013-03-25 8 views
2

Я сталкиваюсь со следующей проблемой:Запуск Баш скрипт из питона

У меня есть этот простой скрипт, названный test.sh:

#!/bin/bash 

function hello() { 
    echo "hello world" 
} 
hello 

, когда я запускаю его из оболочки, я получил ожидаемый результат :

$ ./test2.sh 
hello world 

Однако, когда я пытаюсь запустить его из Python (2.7.?) Я получаю следующее:

>>> import commands 
>>> cmd="./test2.sh" 
>>> commands.getoutput(cmd) 
'./test2.sh: 3: ./test2.sh: Syntax error: "(" unexpected' 

Я верю, что он каким-то образом запускает скрипт из «sh», а не bash. Я так думаю, потому что, когда я запускаю его с ш я получаю то же сообщение об ошибке:

$ sh ./test2.sh 
./test2.sh: 3: ./test2.sh: Syntax error: "(" unexpected 

Кроме того, когда я запускаю команду с предшествующими «Баш» из питона, он работает:

>>> cmd="bash ./test2.sh" 
>>> commands.getoutput(cmd) 
'hello world' 

Мой вопрос: почему python предпочитает запускать скрипт с sh вместо bash, хотя я добавил строку #!/bin/bash в начале скрипта? Как я могу сделать это правильно (я не хочу использовать предыдущий «bash» в python, так как мой скрипт запускается из python удаленными машинами, которые я не могу контролировать).

Спасибо!

+0

Ухм, ваш шэбанг выглядит не так. '# ~/bin/bash', это даже не shebang, а простой комментарий. Это должно быть '#!/Bin/bash'. –

+0

Извините. Была только опечатка –

+1

Она работает без изменений на моем Ubuntu 12.10 32-бит. Может быть что-то с вашей средой по умолчанию, которая вызывает использование sh вместо bash. – TAS

ответ

3

Возможно, возникла другая проблема - shbang и commands.getoutput должны работать правильно, как вы здесь показываете. Измените сценарий оболочки на просто:

#!/bin/bash 
sleep 100 

и запустите приложение еще раз. Проверьте с ps f, что является фактическим деревом процесса. Это правда, что getoutput вызывает sh -c ..., но это не должно меняться, какая оболочка выполняет сам скрипт.

Из минимального теста, как описано в вопросе, я вижу следующий процесс дерево:

11500 pts/5 Ss  0:00 zsh 
15983 pts/5 S+  0:00 \_ python2 ./c.py 
15984 pts/5 S+  0:00  \_ sh -c { ./c.sh; } 2>&1 
15985 pts/5 S+  0:00   \_ /bin/bash ./c.sh 
15986 pts/5 S+  0:00    \_ sleep 100 

Таким образом, в изоляции, это работает, как ожидалось - питон называет sh -c { ./c.sh; } которая выполняется оболочкой, указанной в первом line (bash).

Убедитесь, что вы выполняете правильный скрипт - поскольку вы используете ./test2.sh, дважды проверьте, что вы находитесь в правильном каталоге и выполняете правильный файл. (Делает print open('./test2.sh').read() вернуть то, что вы ожидаете?)

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