Maison > Article > développement back-end > Résumer plusieurs méthodes d'exécution de commandes en python
Il existe trois façons d'exécuter cmd en python que j'utilise actuellement :
1. Utilisez os.system("cmd")
La caractéristique est que le programme tape cmd pendant exécution. Informations exécutées sous Linux.
import os
os.system("ls")
2. Utilisez le module Popen pour générer un nouveau processus
La plupart des gens aiment maintenant le faire. utilisez Popen. La méthode Popen n'imprimera pas d'informations sur l'exécution de cmd sous Linux. En effet, Popen est très puissant et prend en charge une variété de paramètres et de modes. Avant utilisation, vous avez besoin du sous-processus d'importation Popen, PIPE. Mais la fonction Popen a un défaut, c'est-à-dire qu'elle est une méthode de blocage. Si beaucoup de contenu est généré lors de l'exécution de cmd, la fonction est facilement bloquée. La solution n'est pas d'utiliser la méthode wait(), mais la valeur de retour de l'exécution ne peut pas être obtenue.
Le prototype Popen est :
subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, Creationflags=0)
Paramètre bufsize : Spécifiez le tampon.
Le paramètre exécutable permet de spécifier le programme exécutable. Généralement, nous utilisons le paramètre args pour définir le programme à exécuter. Si le paramètre shell est défini sur True, l'exécutable spécifie le shell utilisé par le programme. Sous la plateforme Windows, le shell par défaut est spécifié par la variable d'environnement COMSPEC.
Les paramètres stdin, stdout et stderr représentent respectivement les poignées d'entrée, de sortie et d'erreur standard du programme. Ils peuvent être des PIPE, des descripteurs de fichiers ou des objets de fichier, ou peuvent être définis sur Aucun pour hériter du processus parent.
Le paramètre preexec_fn n'est valide que sur les plateformes Unix et est utilisé pour spécifier un objet appelable qui sera appelé avant l'exécution du processus enfant.
Paramètre Close_sfs : Sous la plate-forme Windows, si close_fds est défini sur True, le processus enfant nouvellement créé n'héritera pas des canaux d'entrée, de sortie et d'erreur du processus parent. Nous ne pouvons pas définir close_fds sur True et rediriger l'entrée, la sortie et l'erreur standard (stdin, stdout, stderr) du processus enfant.
Si le paramètre shell est défini sur true, le programme sera exécuté via le shell.
Le paramètre cwd est utilisé pour définir le répertoire courant du processus enfant.
Le paramètre env est un type de dictionnaire, utilisé pour spécifier les variables d'environnement du processus enfant. Si env = None, les variables d'environnement du processus enfant seront héritées du processus parent.
Paramètre Universal_newlines : Sous différents systèmes d'exploitation, les sauts de ligne du texte sont différents. Par exemple : « /r/n » est utilisé pour indiquer un remplacement sous Windows, tandis que « /n » est utilisé sous Linux. Si ce paramètre est défini sur True, Python traitera ces caractères de nouvelle ligne comme « /n ».
Les paramètres startupinfo et createionflags ne sont efficaces que sous Windows. Ils seront passés à la fonction CreateProcess() sous-jacente pour définir certains attributs du processus enfant, tels que : l'apparence de la fenêtre principale, la priorité de. le processus, etc. attendez.
subprocess.PIPE
Lors de la création d'un objet Popen, subprocess.PIPE peut initialiser les paramètres stdin, stdout ou stderr, représentant le flux standard pour la communication avec le sous-processus.
subprocess.STDOUT
Lors de la création d'un objet Popen, il est utilisé pour initialiser le paramètre stderr, indiquant que les erreurs seront générées via le flux de sortie standard.
Méthode Popen :
Popen.poll()
est utilisée pour vérifier si le processus enfant est terminé. Définit et renvoie l'attribut returncode.
Popen.wait()
Attendez la fin du processus enfant. Définit et renvoie l'attribut returncode.
Popen.communicate(input=None)
Interagissez avec le processus enfant. Envoyez des données à stdin ou lisez les données depuis stdout et stderr. L'entrée de paramètre facultative spécifie les paramètres à envoyer au processus enfant. Communicate() renvoie un tuple : (stdoutdata, stderrdata). Remarque : Si vous souhaitez envoyer des données au processus via son stdin, le paramètre stdin doit être défini sur PIPE lors de la création de l'objet Popen. De même, si vous souhaitez obtenir des données de stdout et stderr, vous devez définir stdout et stderr sur PIPE.
Popen.send_signal(signal)
Envoie un signal au processus enfant.
Popen.terminate()
Arrêtez le processus enfant. Sous la plate-forme Windows, cette méthode appellera l'API Windows TerminateProcess() pour mettre fin au processus enfant.
Popen.kill()
Tuez le processus enfant.
Popen.stdin
Si le paramètre stdin est défini sur PIPE lors de la création de l'objet Popen, Popen.stdin renverra un objet fichier pour que le processus enfant envoie des instructions. Sinon, Aucun n'est renvoyé.
Popen.stdout
Si le paramètre stdout est défini sur PIPE lors de la création de l'objet Popen, Popen.stdout renverra un objet fichier pour que le processus enfant envoie des instructions. Sinon, Aucun n'est renvoyé.
Popen.stderr
Si le paramètre stdout est défini sur PIPE lors de la création de l'objet Popen, Popen.stdout renverra un objet fichier pour que le processus enfant envoie des instructions. Sinon, Aucun n'est renvoyé.
Popen.pid
Obtenir l'ID de processus du processus enfant.
Popen.returncode
Obtenir la valeur de retour du processus. Si le processus n’est pas terminé, renvoyez None.
Par exemple :
p = Popen("cp -rf a/* b/", shell=True, stdout=PIPE, stderr=PIPE)
p. wait ()
if p.returncode != 0 :
print "Error"
return -1
3.
Cette méthode n'imprimera pas d'informations sur l'exécution de cmd sous Linux. Le seul avantage de cette méthode est qu’il ne s’agit pas d’une méthode de blocage. Autrement dit, il n’y a aucun problème de blocage de la fonction Popen. Les commandes d'importation sont requises avant utilisation.
Par exemple :
status, output = commands.getstatusoutput("ls")
Il existe également une méthode pour obtenir uniquement la sortie et le statut :
commandes.getoutput("ls")
commandes.getstatus("ls")
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!