2017-05-29 3 views
0

J'ai un script Python que j'ai écrit pour être appelé depuis la ligne de commande. J'écris un wrapper GUI mais je ne veux pas changer la fonction principale. Dans le code de l'interface graphique, j'appelle le script en utilisant subprocess.run(['./executable.py', input]) mais l'entrée n'est pas visible dans la liste sys.argv de executable.py. Comment est-ce que je passe l'entrée telle qu'elle serait visible à sys.argv?Comment transmettre des entrées dans la liste `sys.argv` d'un autre script Python?

Voici un script de test, je l'ai enregistré en tant que test.py (fait exécutable chmod +x test.py):

#!/usr/bin/env python 
# script to test using sys.argv with subprocess 

import sys 

print(sys.argv) 

Voici ce que je reçois lorsque vous appelez cela de la ligne de commande:

$> ./test.py input.txt 
['./test.py', 'input.txt'] 

Voici ce que je reçois en appelant cela depuis un shell python:

>>> import subprocess 
>>> output = subprocess.run(['./test.py', 'input.txt'], shell=True, stdout=subprocess.PIPE) 
>>> >>> print(output.stdout) 
b"['./test.py']\n" 

Comment afficher input.txt dans sys.argv?

+0

Vous ne devriez pas utiliser 'shell = True' à moins que vous ne sachiez absolument que vous en avez besoin. –

Répondre

0

La meilleure façon de le faire est de supprimer simplement shell=True:

>>> import subprocess 
>>> output = subprocess.run(['./test.py', 'input.txt'], stdout=subprocess.PIPE) 
>>> print(output.stdout) 
b"['./test.py', 'input.txt']\n" 

L'autre option est de combiner la liste des entrées en une seule chaîne:

>>> import subprocess 
>>> output = subprocess.run('./test.py input.txt', shell=True, stdout=subprocess.PIPE) 
>>> print(output.stdout) 
b"['./test.py', 'input.txt']\n" 

Je ne suis pas complètement sûr pourquoi la méthode d'origine (avec une liste d'entrées et shell=True échoue) échoue. Quoi qu'il en soit, pour éviter running unintended commands/code il est préférable d'éviter d'utiliser shell=True (note on when you should use shell=True).

+0

Il est préférable de supprimer 'shell = True' à la place. – jordanm

+0

@ StevenC.Howell 'shell = True' est assez risqué, pour plus de détails consultez la documentation: https://docs.python.org/3/library/subprocess.html#security-considerations – olisch