Pythonで文字列として渡したコードを実行する方法(exec関数の使い方)
Pythonプログラミングでは、コードブロック全体を文字列として扱い、それをより大きなプログラムの一部として動的に実行したい場面があります。本記事では、実行したいコードを文字列として変数に格納し、その変数をラッパープログラムから呼び出してPythonコードとして実行する方法を解説します。
exec()関数による文字列コードの実行
文字列として渡されたコードを実行するには、Pythonの組み込み関数である exec() を使用します。実行対象のコードは、三重引用符(""")で囲むことで、複数行の文字列として定義できます。
サンプルコード
以下の例では、数値のリストに偶数が含まれているかどうかを判定するコードを文字列として変数に格納し、exec()関数で実行しています。
code = """
numbers = [11,33,55,39,55,75,37,21,23,41,13]
for num in numbers:
if num%2 == 0:
print ('the list contains an even number')
break
else:
print ('the list doesnot contain even number')
"""
exec(code)実行結果
上記のコードを実行すると、以下のような結果が出力されます。
the list does not contain even number.
このリストにはすべて奇数が含まれているため、「偶数は含まれていない」というメッセージが表示されます。for文とelseを組み合わせたこの構文は、ループがbreakされずに最後まで完了した場合にelseブロックが実行されるというPython特有の書き方です。
注意点
exec()関数は任意のコードを実行できる強力な機能である一方、外部からの入力をそのまま渡すとセキュリティ上のリスク(任意コード実行攻撃など)につながる可能性があります。信頼できるコードのみを実行対象とするか、必要に応じてglobalsやlocals引数で実行環境の名前空間を制限することを推奨します。
-
Pythonのstringprepモジュールで学ぶUnicode文字列の事前準備
stringprep(文字列準備)とは インターネット上でさまざまな識別子を扱う際には、それらが等しいかどうかを比較する必要があります。しかし、比較の手順はアプリケーションの分野によって異なり、たとえば大文字と小文字を区別しないケースなども存在します。こうした情報を確認し、文字列を適切に正規化するために使われるのが stringprep(文字列準備)です。 RFC 3454では、Unicode文字列をネットワーク上へ送信する前に施すべき「準備」の手順が定義されています。この準備プロセスを経た文字列は、一定の正規化された形式を持つことになります。 RFCでは一連のテーブルが定義されており、これら
-
【Python】文字列として書かれたPythonコードを実行する方法:exec()とeval()の使い分け
exec()でPythonのステートメントを実行する 文字列として記述されたPythonのコード(ステートメント)を実際に実行したい場合は、組み込み関数のexec()を使用します。引数に渡された文字列がPythonのコードとして解釈され、その場で実行されます。 >>> my_code = print(Hello World!) >>> exec(my_code) Hello World! 上記の例では、変数my_codeに格納された文字列がexec()によってコードとして評価され、「Hello World!」が出力されています。 eval()で式の値を評価