Comment exécuter une commande de ligne de commande dans un script Python?

16

J'utilise 2 scripts distincts, Scale1.pyet Scale2.py. Pour les exécuter j'entre sudo python Scale1.pyou sudo python Scale2.pydepuis la ligne de commande du terminal. Je voudrais avoir une ligne dans le Scale2.pyscript dans laquelle si j'appuie sur un bouton, le programme s'arrête et s'exécute Scale1.py. Quelque chose comme ça, qui ne fonctionne pas.

if GPIO.input(23) == False:
    break(sudo python Scale1.py)
Rico
la source

Réponses:

24

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

vous devrez d'abord importer le module os

import os

Je n'ai pas de pi avec moi pour tester, mais cela vient de la deuxième réponse à cette question: /programming/89228/calling-an-external-command-in-python

mrwhale
la source
C'est ce que j'ai essayé et cela a fonctionné, merci beaucoup Harry! Mais je devais d'abord combiner les deux programmes. Maintenant, le système os.system ("sudo python Scale3.py") redémarre simplement au début du programme Scale3.py, ce qui est bien. Je pense que l'importation Scale3.py fonctionnera également. Je n'ai pas essayé le sous-processus, cela semble intéressant et c'est probablement quelque chose que j'ai besoin d'apprendre.
Rico
os.system()a été déprécié en faveur de subprocess, voir stackoverflow.com/a/4256153/4212158
crypdick
11

En général, utilisez le module de sous - processus

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

pour les appels en ligne de commande.

Un exemple de traitement du résultat d'un appel de sous-processus;

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

Le sous-processus remplace plusieurs modules et fonctions plus anciens, comme os.system et os.spawn . Il fait un bon travail de désinfection des arguments, il vous protège donc de l' injection de shell .

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

Bien sûr, pour exécuter un deuxième script python, aucun appel CLI n'est nécessaire, vous pouvez les importer.

Janghou
la source
J'essaie d'apprendre à émettre des commandes à partir d'un script Python (voir ici et ici ) et j'ai des problèmes. Je me demande si cela subprocesspourrait être mieux dans mon cas également.
uhoh
6

Vous pouvez utiliser sudo comme le suggère harry sib, mais vous devrez ajouter l'utilisateur exécutant le premier script au fichier sudoers .

La meilleure façon d'exécuter un script python à partir d'un autre script python est de l'importer. Vous devriez avoir la logique de votre script dans une méthode du deuxième script:

# Scale2.py
def run ():
    faire en premier()
    do_second ()
    [...]

# Exécutez-le uniquement s'il est appelé depuis la ligne de commande
si __name__ == '__main__':
    courir()
# Scale1.py
importer Scale2

if (GPIO.input (23) == False):
    Scale2.run ()
Gagaro
la source
2
+1, puisque python en est capable, ce sera la cleanestréponse.
LuWi
1
+1, c'est la bonne façon de faire ce que le PO souhaite et devrait probablement être la réponse acceptée.