Python Shellでコマンドを実行して、引数付きのファイルを実行したいと思います。
例:execfile("abc.py")
しかし、2つの引数を追加する方法は?
execfile
はPythonファイルを実行しますが、スクリプトとしてではなく、それをロードすることにより実行します。引数ではなく、変数バインディングでのみ渡すことができます。
Python内からプログラムを実行する場合は、 subprocess.call
を使用します。例えば。
subprocess.call(['./abc.py', arg1, arg2])
これを試して:
import sys
sys.argv = ['arg1', 'arg2']
execfile('abc.py')
abc.py
が終了すると、呼び出し元プログラムに制御が返されることに注意してください。本当に終了したら、abc.py
はquit()
を呼び出すことができることにも注意してください。
実際、これをやりたくはありませんか?
import sys
sys.argv = ['abc.py','arg1', 'arg2']
execfile('abc.py')
import sys
import subprocess
subprocess.call([sys.executable, 'abc.py', 'argument1', 'argument2'])
モジュールを現在のインタープリタープロセスに読み込み、外部でPythonスクリプトを呼び出すのは混乱しています。
前者は、目的のファイルをimport
ingすることで実行できます。 execfile はインポートに似ていますが、モジュールを作成するのではなく、単にファイルを評価します。シェルスクリプトの「ソース」に似ています。
後者は、サブプロセスモジュールを使用して実行できます。インタープリターの別のインスタンスを生成し、必要なパラメーターを渡します。これは、バッククォートを使用したシェルスクリプトでのシェルアウトに似ています。
さらに興味深いシナリオについては、runpy
モジュールもご覧ください。 python 2.7以降、run_path
関数があります。例えば:
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__')
execfile()
でコマンドライン引数を渡すことはできません。代わりに subprocess
を見てください。
実行するpythonファイルにPYTHONINSPECT
を設定した場合
[repl.py]
import os
import sys
from time import time
os.environ['PYTHONINSPECT'] = 'True'
t=time()
argv=sys.argv[1:len(sys.argv)]
execfile
を使用する必要はなく、シェルで通常どおり引数を使用してファイルを直接実行できます。
python repl.py one two 3
>>> t
1513989378.880822
>>> argv
['one', 'two', '3']
subprocess.call
に加えて、subprocess.Popen
も使用できます。次のように
subprocess.Popen(['./script', arg1, arg2])
スクリプトを並行して実行し、それらに異なる引数を与えたい場合、以下のようにすることができます。
import os
os.system("python script.py arg1 arg2 & python script.py arg11 arg22")