Ich möchte einen Befehl in Python Shell ausführen, um eine Datei mit einem Argument auszuführen.
Zum Beispiel: execfile("abc.py")
aber wie füge ich 2 Argumente hinzu?
execfile
führt eine Python-Datei aus, aber indem sie geladen wird, nicht als Skript. Sie können nur Variablenbindungen übergeben, keine Argumente.
Wenn Sie ein Programm in Python ausführen möchten, verwenden Sie subprocess.call
. Z.B.
subprocess.call(['./abc.py', arg1, arg2])
versuche dies:
import sys
sys.argv = ['arg1', 'arg2']
execfile('abc.py')
Wenn abc.py
beendet ist, wird die Steuerung an das aufrufende Programm zurückgegeben. Beachten Sie auch, dass abc.py
quit()
aufrufen kann, wenn er tatsächlich beendet ist.
Wollten wir das eigentlich nicht?
import sys
sys.argv = ['abc.py','arg1', 'arg2']
execfile('abc.py')
import sys
import subprocess
subprocess.call([sys.executable, 'abc.py', 'argument1', 'argument2'])
Sie sind verwirrend, wenn Sie ein Modul in den aktuellen Interpreterprozess laden und ein Python-Skript extern aufrufen.
Ersteres kann durch import
ing der gewünschten Datei ausgeführt werden. execfile ähnelt dem Importieren, aber es wertet die Datei einfach aus, anstatt daraus ein Modul zu erstellen. Ähnlich wie "Sourcing" in einem Shell-Skript.
Letzteres kann mit dem Subprozess-Modul durchgeführt werden. Sie spawn eine andere Instanz des Interpreters aus und übergeben die gewünschten Parameter dazu. Dies ähnelt dem Shells out in einem Shell-Skript mit Backticks.
Für weitere interessante Szenarien können Sie auch das Modul runpy
betrachten. Seit Python 2.7 verfügt es über die Funktion run_path
. Z.B:
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__')
Sie können keine Befehlszeilenargumente mit execfile()
übergeben. Schauen Sie sich stattdessen subprocess
an.
Wenn Sie in der Python-Datei, die Sie ausführen möchten, PYTHONINSPECT
setzen
[repl.py]
import os
import sys
from time import time
os.environ['PYTHONINSPECT'] = 'True'
t=time()
argv=sys.argv[1:len(sys.argv)]
execfile
muss nicht verwendet werden, und Sie können die Datei wie üblich direkt in der Shell ausführen:
python repl.py one two 3
>>> t
1513989378.880822
>>> argv
['one', 'two', '3']
Neben subprocess.call
Können Sie auch subprocess.Popen
Verwenden. Wie das folgende
subprocess.Popen(['./script', arg1, arg2])
Wenn Sie die Skripts parallel ausführen und ihnen unterschiedliche Argumente geben möchten, können Sie dies wie folgt tun.
import os
os.system("python script.py arg1 arg2 & python script.py arg11 arg22")