Python でスクリプトを実行する

Vaibhav Vaibhav 2023年10月10日
  1. Python で Python スクリプトを実行する
  2. globalslocals の使用
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

globalslocalsexec() に渡されない場合、(スクリプトを実行するための)要件は自動的に処理されます。Python は、スクリプトを実行するために必要なすべての変数または関数を理解するのに十分なほど賢いです。たとえば、次のコードはエラーなしで完全に実行されます。

from random import randint

code = "print(randint(1, 6))"
exec(code)  # No globals or locals passed

globalslocals の使用

カスタム関数とインポートされた関数は、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
著者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.