Maison >développement back-end >Tutoriel Python >Pourquoi subprocess.Popen échoue-t-il lors de la transmission de variables en tant qu'arguments et comment puis-je y remédier ?
Dépannage des écarts de transmission de l'argument Subprocess.Popen
Lors de la tentative de transmission de variables à subprocess.Popen() pour l'exécution du script, les utilisateurs peuvent rencontrer des difficultés si les arguments sont stockés dans des variables. Pour résoudre ce problème, approfondissons le problème et proposons une solution.
Le problème :
L'approche initiale consiste à transmettre des arguments directement à partir des variables, comme ceci :
p = subprocess.Popen( ["python mytool.py -a ", servers[server]['address'], "-x", servers[server]['port'], "-p", servers[server]['pass'], "some additional command"], shell=True, stdout=subprocess.PIPE )
Cependant, cette méthode ne parvient pas à exécuter la commande avec succès.
Le Solution :
La clé pour résoudre ce problème réside dans la suppression de shell=True. Lorsqu'il est défini sur True, les arguments de Popen() sont traités différemment sur les systèmes Unix. En supprimant shell=True, nous pouvons directement transmettre les arguments sous forme de liste :
import sys from subprocess import Popen, PIPE # populate list of arguments args = ["mytool.py"] for opt, optname in zip("-a -x -p".split(), "address port pass".split()): args.extend([opt, str(servers[server][optname])]) args.extend("some additional command".split()) # run script p = Popen([sys.executable or 'python'] + args, stdout=PIPE) # use p.stdout here...
Contourner le shell élimine le problème d'analyse précédent et permet une exécution correcte du command.
Considérations de sécurité :
Il est important de noter que la définition de shell=True lors du traitement d'une entrée externe est déconseillée en raison de risques de sécurité potentiels. Pour cette raison, il est recommandé d'éviter d'utiliser shell=True et d'adopter plutôt la méthode décrite ci-dessus pour transmettre des arguments à Popen().
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!