Как запустить команду командной строки в скрипте Python?

16

Я использую 2 отдельных сценария, Scale1.pyи Scale2.py. Для их запуска я ввожу sudo python Scale1.pyили sudo python Scale2.pyиз командной строки терминала. Я хотел бы иметь строку в Scale2.pyсценарии, в которой, если я нажимаю кнопку, программа прерывается и запускается Scale1.py. Как то так, что не работает.

if GPIO.input(23) == False:
    break(sudo python Scale1.py)
Рико
источник

Ответы:

24

os.system("sudo python scale1.py")

сначала вам нужно будет импортировать модуль os

import os

У меня нет атм с моим атм для тестирования, но это приходит от второго ответа на этот вопрос: /programming/89228/calling-an-external-command-in-python

mrwhale
источник
Это то, что я попробовал, и это сработало, спасибо Гарри! Но мне сначала нужно было объединить обе программы. Теперь os.system ("sudo python Scale3.py") просто перезапускается в начале программы Scale3.py, и это нормально. Я думаю, что импорт Scale3.py также будет работать. Я не пробовал подпроцесс, он выглядит интересно и, вероятно, мне нужно чему-то научиться.
Рико
os.system()было исключено в пользу subprocess, см. stackoverflow.com/a/4256153/4212158
crypdick
11

В общем, используйте модуль подпроцесса

subprocess.call(["sudo","python","scale1.py"]) 

для вызовов командной строки.

Пример обработки результата вызова подпроцесса;

 result = subprocess.check_output(['sudo','service','mpd','restart'])

Подпроцесс заменяет несколько старых модулей и функций, таких как os.system и os.spawn . Он хорошо справляется с дезинфекцией аргументов и защищает вас от попадания в оболочку .

https://docs.python.org/2/library/subprocess.html

Конечно, для запуска второго скрипта Python нет необходимости в вызове CLI, вы можете импортировать его.

Janghou
источник
Я пытаюсь узнать, как выдавать команды из скрипта Python (см. Здесь и здесь ), и возникают некоторые проблемы. Интересно, subprocessможет ли быть лучше и в моем случае?
ух
6

Вы можете использовать sudo, как предложил Гарри Сиб, но вам нужно будет добавить пользователя, запускающего первый скрипт, в файл sudoers .

Лучший способ запустить скрипт Python из другого скрипта Python - это импортировать его. Вы должны иметь логику вашего скрипта в методе во втором скрипте:

# Scale2.py
def run ():
    do_first ()
    do_second ()
    [...]

# Запускайте его только если вызывается из командной строки
если __name__ == '__main__':
    бегать()
# Scale1.py
импорт Scale2

if (GPIO.input (23) == False):
    Scale2.run ()
Gagaro
источник
2
+1, поскольку питон способен на это, это будет cleanestответом.
LuWi
1
+1, это правильный способ сделать то, что хочет ОП, и, вероятно, должен быть принятым ответом.