Python でスクリプトを実行する
この記事では、Python を使用してさらに別の Python スクリプトを実行する方法について説明します。
Python で Python スクリプトを実行する
exec()
関数を使用して、Python を使用して Python スクリプトを実行できます。exec()
関数は、文字列形式とバイト形式の両方で Python コードを動的に実行できるようにする Python ユーティリティです。この関数は、次の 3つの引数を受け入れます。
object
:文字列またはバイト形式の Python コードglobals
:これはオプションの引数です。これは辞書であり、グローバル関数と変数が含まれています。locals
:これはオプションの引数です。これは辞書であり、ローカル関数と変数が含まれています。
例については、次のコードを参照してください。
file_name = "code.py"
content = open(file_name).read()
exec(content)
上記のコードは、最初に code.py
という名前で作業ディレクトリ内のファイルを開き、そのコンテンツを読み取り、content
という名前で変数内に格納してから、読み取ったコンテンツを exec()
に渡します。関数。読み取られたコンテンツはいくつかの Python コードであり、exec()
メソッドはその Python コードを実行します。
ローカル変数またはグローバル変数がある場合は、それらをディクショナリ内に格納して、実行可能スクリプトに渡すことができます。これで、スクリプトはこれらの変数を利用してコードを実行できるようになります。グローバル変数として渡していない実行可能スクリプト内のいくつかの関数を使用すると、メインプログラムが例外をスローすることに注意してください。
次のコードは同じことを示しています。
from random import randint
code = "print(randint(1, 6))"
exec(code, {}, {}) # Empty globals and locals
出力:
Traceback (most recent call last):
File "<string>", line 4, in <module>
File "<string>", line 1, in <module>
NameError: name 'randint' is not defined
globals
と locals
が exec()
に渡されない場合、(スクリプトを実行するための)要件は自動的に処理されます。Python は、スクリプトを実行するために必要なすべての変数または関数を理解するのに十分なほど賢いです。たとえば、次のコードはエラーなしで完全に実行されます。
from random import randint
code = "print(randint(1, 6))"
exec(code) # No globals or locals passed
globals
と locals
の使用
カスタム関数とインポートされた関数は、globals
を介して exec()
関数に渡すことにより、実行可能スクリプト内に作成できます。上記のように、これらの依存関係が見つからない場合、例外が発生します。
次のコードを参照してください。ここでは、カスタム関数を定義し、random
パッケージから関数をインポートします。次に、両方の関数が、globals
パラメーターを介して辞書内にラップされた exec()
関数に渡されます。
from random import randint
def get_my_age():
return 19
globals = {"randint": randint, "get_my_age": get_my_age}
code = """
print(randint(1, 6))
print(get_my_age())
"""
exec(
code,
globals,
)
出力:
5 # It can be any number between 1 and 6, both inclusive
19
現在、これらの関数は globals
パラメーターを介して渡されています。locals
に渡すこともできます。exec
関数はキーワード引数を受け入れないため、globals
に空の辞書を渡し、locals
を渡す必要があります。
from random import randint
def get_my_age():
return 19
locals = {"randint": randint, "get_my_age": get_my_age}
code = """
print(randint(1, 6))
print(get_my_age())
"""
exec(code, {}, locals)
出力:
2 # It can be any number between 1 and 6, both inclusive
19