Як запустити командний рядок у сценарії 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


Це те, що я спробував, і це спрацювало, дякую Гаррі! Але мені довелося спочатку поєднувати обидві програми. Тепер os.system ("sudo python Scale3.py") просто перезапускається на початку програми Scale3.py, що добре. Я думаю, імпорт Scale3.py також буде працювати. Я не пробував підпроцес, це виглядає цікаво і, мабуть, мені щось потрібно вивчити.
Ріко

os.system()було depricated на користь subprocessсм stackoverflow.com/a/4256153/4212158
crypdick

12

Загалом, використовуйте модуль підпроцесу

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, ви можете імпортувати їх.


Я намагаюся навчитися видавати команди з сценарію Python (дивіться тут і тут ) і маю деякі проблеми. Цікаво, чи subprocessможе бути краще і в моєму випадку.
uhoh

6

Ви можете використовувати sudo, як запропонував Гаррі Сиб, але вам доведеться додати користувача, який запустив перший сценарій, до файлу sudoers .

Найкращий спосіб запустити скрипт python з іншого сценарію python - це імпортувати його. Ви повинні мати логіку вашого сценарію в методі другого сценарію:

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

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

якщо (GPIO.input (23) == Невірно):
    Scale2.run ()

2
+1, Оскільки python здатний на це, це буде cleanestвідповідь.
LuWi

1
+1, це правильний спосіб робити те, що хоче ОП, і, мабуть, має бути прийнятою відповіддю.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.