ユーザーが選択した値に応じてパッケージをインポートしたい。
デフォルトはfile1.py
:
from files import file1
ユーザーがfile2
、 そのはず :
from files import file2
PHPでは、 variable variables を使用してこれを行うことができます。
$file_name = 'file1';
include($$file_name);
$file_name = 'file2';
include($$file_name);
Pythonでこれを行うにはどうすればよいですか?
Pythonには、PHPの「変数変数」に直接相当する機能はありません。 「変数」の値(または他の式の値)を取得するには、eval
関数を使用できます。
foo = "Hello World"
print eval("foo")
ただし、これはimport
ステートメントでは使用できません。
__import__
変数を使用してインポートする関数。
package = "os"
name = "path"
imported = getattr(__import__(package, fromlist=[name]), name)
に等しい
from os import path as imported
古いスレッドですが、答えが必要だったので、他の誰かがまだ...
Python 2.7+:
import importlib
my_module = importlib.import_module("package.path.%s" % module_name)
とにかく、これらのステートメントと関数の仕組みは次のとおりです。
_
import X
_はモジュールXをインポートし、現在のネームスペースにそのモジュールへの参照を作成します。または、言い換えると、このステートメントを実行した後、_X.name
_を使用してモジュールXで定義されたものを参照できます。_
from X import *
_はモジュールXをインポートし、現在のネームスペースに、そのモジュールで定義されているすべてのパブリックオブジェクト(つまり、「_」で始まる名前を持たないすべて)への参照を作成します。つまり、このステートメントを実行した後、単純な名前を使用してモジュールXで定義されたものを参照できます。ただし、X自体は定義されていないため、_X.name
_は機能しません。また、名前が既に定義されている場合、新しいバージョンに置き換えられます。また、Xの名前が他のオブジェクトを指すように変更されても、モジュールは気付きません。_
from X import a, b, c
_はモジュールXをインポートし、現在のネームスペースに指定されたオブジェクトへの参照を作成します。または、言い換えると、プログラムでa
とb
とc
を使用できるようになりました。最後に、
X = __import__(‘X’)
は_import X
_と同じように機能しますが、1)モジュール名を文字列として渡し、2)変数に明示的に割り当てます。現在のネームスペースで。
そして、それがあなたが興味を持っている最後の方法です。
単に書く(例えば):
_var = "datetime"
module = __import__(var)
_
インポートするものをユーザーに選択させることは、おそらく非常に悪い考えです。パッケージはインポート時にコードを実行できるため、ユーザーがシステム上で任意にコードを実行できるようになります。次のようなことをする方がずっと安全です
if user_input == 'file1.py':
from files import file1 as file
Elif user_input == 'file2.py':
from files import file2 as file
else:
file = None
print "Sorry, you can't import that file"
mattjbray
の答えに基づいて:
from importlib import import_module
# lookup in a set is in constant time
safe_names = {"file1.py", "file2.py", "file3.py", ...}
user_input = ...
if user_input in safe_names:
file = import_module(user_input)
else:
print("Nope, not doing this.")
数行のコードを保存し、safe_names
プログラムで、または複数のモジュールをロードして、たとえば、それらを辞書に割り当てます。