2013-09-20 3 views
0

Я пытаюсь вызвать скрипт оболочки (Bash) из python. Сценарий находится в каталоге my/home/user/bin с разрешением на выполнение для группы & пользователя, то есть -rwxr-xr--. Я использую subprocess.check_call(["/home/user/bin/script.sh %s %s" % (subj,-6)],shell=True), и это генерирует код статуса выхода 127. Добавление команды stderr=subprocess.STDOUT в команду ничего не дает для выяснения. Вот точный результат:Подпроцесс python для вызова сценария оболочки (Bash)

CalledProcessError: Command '['/home/kambiz/bin/MNE_setup_source_space.sh kubi_td104 -6']' returned non-zero exit status 127`

Я считаю, что это может быть проблема, связанная с PATH, это правильно? Я не знаю, как это решить. Если я уже передаю абсолютный путь к исполняемому файлу, как может возникнуть проблема с PATH?

Заранее спасибо

ответ

0

Не используйте shell=True. Не передавайте аргументы как часть argv[0]. Пройди свой вектор аргумент в качестве вектора - который должен сказать, в Python, список:

subprocess.check_call(["/home/user/bin/script.sh", str(subj), "-6"]) 

Если вы были собираетесь использовать shell=True, вы могли бы сделать это следующим образом:

subprocess.check_call("/home/user/bin/script.sh %s %s" % (subj,-6), shell=True) 

... т. Е. Вы не использовали бы форму списка вообще.


Чтобы выяснить, почему то, что вы в настоящее время пытается не удается - потому, что вы используете shell=True, он пытается передать только первый элемент списка в качестве сценария, а также дополнительные аргументы в качестве дополнительных элементов ARGV которые бы только быть прочитанным или интерпретированным, если скрипт, переданный в первом аргументе, решил посмотреть на них (например, ссылаясь на "$1", "$2" и т.п.).

shell=True необходимо только в очень редких случаях, когда требуется использовать оболочку для выполнения перенаправления или логики перед запуском программы, которую вы пытаетесь запустить, и имеет серьезные проблемы с безопасностью, если какой-либо неподтвержденный вход включен в выполняемую команду , Не используйте его, если вы не очень, очень уверены, что вам нужно.

+0

'subprocess.check_call (["/home/user/bin/script.sh ", subj, str (-6)])' где 'subj' уже является строковой переменной рабочего пространства, генерирует ошибку формата Ex Ex [Errno 8]. С которым я столкнулся, прежде чем наткнуться на код выхода 127. – ktavabi

+0

Это, однако, 'subprocess.check_call ("/home/kambiz/bin/MNE_setup_source_space.sh% s% s "% (subj, str (-6)), shell = True)' просто выплевывает '0'. Что это значит? Я не вижу результатов скрипта! – ktavabi

+0

@ Kambysese В своем первом комментарии вы не набрасываете 'subj' на строку (как показано в примере). Вам нужно это сделать. –

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