2014-10-07 6 views
22

Я пытаюсь запустить команды Python и bash в сценарии bash. В сценарии Баша, я хочу, чтобы выполнить некоторые команды Баша приложенной петлей Python:Как запустить команды bash внутри скрипта Python

#!/bin/bash 

python << END 
for i in range(1000): 
    #execute‬ some bash command such as echoing i 
END 

Как я могу это сделать?

ответ

38

subprocess Используйте, например .:

import subprocess 
# ... 

subprocess.call(["echo", i]) 

Существует другая функция, как subprocess.call: subprocess.check_call. Это точно так же, как вызов, только что он выдает исключение, если команда, выполненная с возвратом с ненулевым кодом выхода. Это часто реализуемое поведение в сценариях и утилитах.

subprocess.check_output ведет себя так же, как check_call, но возвращает стандартный выход программы.


Если вам не нужны функции оболочки (например, расширения переменных, маски, ...), никогда не используйте оболочки = True (скорлупа = False по умолчанию). Если вы используете shell = True, то экранирование оболочки - это ваша работа с этими функциями, и они являются дырой в безопасности, если передаются неутвержденный ввод пользователя.

То же самое относится к os.system() - это частой источник проблем безопасности. Не используйте его.

+9

Почему не рекомендуется использовать импорт os? –

+0

@LuisRamonRamirezRodriguez, 'os.system()' обеспечивает меньший контроль, чем интерфейс 'subprocess.Popen' - что самое главное, он не предоставляет возможности передавать данные вне диапазона из кода (или для обеспечения литерального массива argv) , что затрудняет предотвращение уязвимостей оболочки. –

+1

@ dom0, 'shell = True' - это неправильная вещь для вашего' subprocess.call (["echo", i], shell = True) 'example: скрипт оболочки, который запускается, является просто' echo', без аргументов, и 'i' передается в качестве аргумента в оболочку, на которую не ссылается скрипт. –

16

Посмотрите на модуль subprocess. Существует метод Popen и некоторые функции обертки, такие как call.

  • Если вам необходимо проверить вывод (получить результирующую строку):

    output = subprocess.check_output(args ....) 
    
  • Если вы хотите, чтобы ждать исполнения до конца, прежде чем продолжить:

    exitcode = subprocess.call(args ....) 
    
  • Если вам нужно больше функциональности, например, устанавливать переменные среды, использовать базовый конструктор Popen:

    subprocess.Popen(args ...) 
    

Вспомнить подпроцесс - это модуль более высокого уровня. Он должен заменить устаревшие функции из модуля ОС.

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