Je voudrais exécuter une commande dans Python Shell pour exécuter un fichier avec un argument.
Par exemple: execfile("abc.py")
mais comment ajouter 2 arguments?
execfile
exécute un fichier Python, mais en le chargeant, pas en tant que script. Vous pouvez uniquement transmettre des liaisons de variable, pas des arguments.
Si vous voulez exécuter un programme depuis Python, utilisez subprocess.call
. Par exemple.
subprocess.call(['./abc.py', arg1, arg2])
essaye ça:
import sys
sys.argv = ['arg1', 'arg2']
execfile('abc.py')
Notez que lorsque abc.py
se termine, le contrôle sera retourné au programme appelant. Notez aussi que abc.py
peut appeler quit()
s'il est effectivement terminé.
En fait, ne voudrions-nous pas faire cela?
import sys
sys.argv = ['abc.py','arg1', 'arg2']
execfile('abc.py')
import sys
import subprocess
subprocess.call([sys.executable, 'abc.py', 'argument1', 'argument2'])
Vous confondez le chargement d'un module dans le processus d'interprétation en cours et l'appel d'un script Python en externe.
Le premier peut être fait en import
le fichier qui vous intéresse. execfile est similaire à l’importation, mais il évalue simplement le fichier au lieu de créer un module à partir de celui-ci. Similaire à "sourcing" dans un script Shell.
Ce dernier peut être fait en utilisant le module de sous-processus. Vous créez une autre instance de l'interpréteur et transmettez tous les paramètres souhaités. Ceci est similaire au shelling out dans un script Shell utilisant des backticks.
Pour des scénarios plus intéressants, vous pouvez également consulter le module runpy
. Depuis python 2.7, il a la fonction run_path
. Par exemple:
import runpy
import sys
# argv[0] will be replaced by runpy
# You could also skip this if you get sys.argv populated
# via other means
sys.argv = ['', 'arg1' 'arg2']
runpy.run_path('./abc.py', run_name='__main__')
Vous ne pouvez pas passer d'arguments en ligne de commande avec execfile()
. Regardez plutôt subprocess
.
Si vous définissez PYTHONINSPECT
dans le fichier python que vous voulez exécuter
[repl.py]
import os
import sys
from time import time
os.environ['PYTHONINSPECT'] = 'True'
t=time()
argv=sys.argv[1:len(sys.argv)]
il n'est pas nécessaire d'utiliser execfile
et vous pouvez directement exécuter le fichier avec les arguments comme d'habitude dans le shell:
python repl.py one two 3
>>> t
1513989378.880822
>>> argv
['one', 'two', '3']
Si vous voulez exécuter les scripts en parallèle et leur donner différents arguments, vous pouvez le faire comme ci-dessous.
import os
os.system("python script.py arg1 arg2 & python script.py arg11 arg22")