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 ?

Pourquoi subprocess.Popen échoue-t-il lors de la transmission de variables en tant qu'arguments et comment puis-je y remédier ?

Linda Hamilton
Libérer: 2024-12-04 04:32:10
original
560 Les gens l'ont consulté

Why Does subprocess.Popen Fail When Passing Variables as Arguments, and How Can I Fix It?

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
)
Copier après la connexion

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...
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal