80 votes

Exécuter un fichier avec des arguments dans le shell Python

Je voudrais lancer une commande dans Python Shell pour exécuter un fichier avec un argument.

Par exemple : execfile("abc.py") mais comment ajouter 2 arguments ?

0 votes

Comment le code dans le fichier que vous voulez exécuter récupère-t-il les arguments ?

0 votes

Je sais que c'est une vieille question, mais vous pourriez alternativement passer les valeurs pour exécuter un fichier py dans un fichier et juste l'ouvrir et lire les valeurs.

60voto

user2757262 Points 31

En fait, ne voudrions-nous pas faire ça ?

import sys
sys.argv = ['abc.py','arg1', 'arg2']
execfile('abc.py')

0 votes

...et ensuite, il s'avère que python indique une version différente (2-vs-3) de Python :)

0 votes

Je dois décoter la réponse de buggywhip parce qu'il a manqué cette subtilité.

0 votes

Même si cela échoue si abc.py lit from sys import argv

59voto

buggywhip Points 151

Essayez ceci :

import sys
sys.argv = ['arg1', 'arg2']
execfile('abc.py')

Notez que lorsque abc.py à la fin, le contrôle sera rendu au programme appelant. Notez également que abc.py peut appeler quit() si elle est effectivement terminée.

0 votes

Rien n'est transmis à abc.py pour autant que je puisse dire, et je ne vois pas pourquoi ça devrait.

8 votes

Lorsque mon fichier 'abc.py' a argparse pour analyser les arguments d'entrée, j'ai obtenu une erreur avec cette méthode : trop peu d'arguments. J'ai exécuté python abc.py arg1 arg2 dans le terminal (cette méthode fonctionne sans erreur) et a ensuite imprimé le contenu du fichier sys.argv par impression et a constaté que sys.argv contient le nom 'abc.py' comme premier élément de la liste. En fait, le code de l'utilisateur2757262 ci-dessous avec sys.argv = ['abc.py','arg1', 'arg2'] est celle qui a fonctionné !

5 votes

La documentation dit aussi, " argv[0] est le nom du script" .

58voto

larsmans Points 167484

execfile exécute un fichier Python, mais en le chargeant, et non comme un script. Vous pouvez seulement passer des liaisons de variables, pas des arguments.

Si vous voulez exécuter un programme à partir de Python, utilisez subprocess.call . Par exemple

import subprocess
subprocess.call(['./abc.py', arg1, arg2])

8 votes

Le format suivant fonctionne pour moi : subprocess.call("python abc.py 'arg1'", shell=True)

2 votes

@geotheory Bien sûr que ça marche, mais c'est moins sûr et ça devient épineux quand on veut passer des chaînes de caractères avec des guillemets à un sous-processus.

4 votes

Pouvez-vous expliquer ce que vous voulez dire par "le charger, pas comme un script" ? Quelle est la différence ?

30voto

nosklo Points 75862
import sys
import subprocess

subprocess.call([sys.executable, 'abc.py', 'argument1', 'argument2'])

12voto

Noufal Ibrahim Points 32200

Vous confondez le chargement d'un module dans le processus d'interprétation actuel et l'appel d'un script Python en externe.

Le premier peut être fait par import le fichier qui vous intéresse. fichier d'exécution est similaire à l'importation, mais il évalue simplement le fichier plutôt que de créer un module à partir de celui-ci. Similaire au "sourcing" dans un shell script.

Ce dernier peut être réalisé à l'aide du module de sous-processus. Vous lancez une autre instance de l'interpréteur et lui passez les paramètres que vous voulez. Ceci est similaire à l'éjection d'un shell script en utilisant des backticks.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X