Maison > développement back-end > Tutoriel Python > Pourquoi « subprocess.Popen » ne fonctionne-t-il pas avec les arguments variables dans les listes lorsque « shell=True » ?

Pourquoi « subprocess.Popen » ne fonctionne-t-il pas avec les arguments variables dans les listes lorsque « shell=True » ?

Linda Hamilton
Libérer: 2024-11-26 05:46:17
original
194 Les gens l'ont consulté

Why Doesn't `subprocess.Popen` Work with Variable Arguments in Lists When `shell=True`?

Passer des variables à subprocess.Popen : pourquoi cela ne fonctionne pas avec les arguments dans les listes

Lors de l'utilisation de subprocess.Popen pour appeler un autre Python script, vous pouvez rencontrer des problèmes lors de la transmission des arguments stockés dans les variables. Cela peut se produire lorsque vous tentez d'exécuter une commande comme la suivante :

1

2

3

4

5

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

Le problème :

Le problème survient en raison de l'utilisation de shell=True. Lorsque cet indicateur est activé, les arguments passés à Popen() sont traités différemment sur les systèmes Unix. Le shell interprète les arguments comme une seule chaîne de commande, ce qui peut entraîner un comportement inattendu.

La solution :

Pour résoudre ce problème, abandonnez l'utilisation de shell=True. Au lieu de cela, créez directement une liste d’arguments et transmettez-la à Popen(). Voici un exemple :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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()

Copier après la connexion

En supprimant shell=True et en construisant la liste d'arguments manuellement, vous vous assurez que les variables sont correctement transmises au script appelé.

Attention de sécurité :

Il est important de noter que passer shell=True pour les commandes impliquant une entrée externe peut présenter un risque de sécurité, comme mentionné dans le documentation des sous-processus. Si vous gérez les entrées fournies par l'utilisateur dans votre script, il est fortement recommandé d'éviter d'utiliser shell=True pour éviter des 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!

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