Problèmes de transmission de variables avec Subprocess.Popen()
Lors de la tentative de transmission d'arguments stockés dans des variables à subprocess.Popen(), certains utilisateurs éprouvent des difficultés. C'est particulièrement le cas lorsqu'il s'agit d'arguments tels que les suivants :
servers[server]['address'] servers[server]['port'] servers[server]['pass']
L'application de ces variables directement à la commande Popen() comme indiqué ci-dessous peut entraîner des erreurs :
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 )
Solution : désactiver l'exécution du shell
Pour résoudre ce problème, supprimez le Argument shell=True de l'appel Popen(). Cela empêchera les arguments d'être traités spécialement par le shell, ce qui leur permettra d'être transmis sous forme de chaînes.
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... p.stdout.close() p.wait()
Notez que l'utilisation de shell=True pour les commandes prenant en compte les entrées de l'utilisateur présente des éléments de sécurité. risques. Envisagez toujours des méthodes alternatives pour protéger les entrées des utilisateurs contre les vulnérabilités potentielles.
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!