web-dev-qa-db-fra.com

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

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?

59
olidev

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])
44
Fred Foo

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é.

51
buggywhip

En fait, ne voudrions-nous pas faire cela?

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

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

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 importle 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. 

10
Noufal Ibrahim

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__')
6
petre

Vous ne pouvez pas passer d'arguments en ligne de commande avec execfile(). Regardez plutôt subprocess .

5

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']
1
loretoparisi

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")
0
Mehmet nuri