2011-07-13 12 views
30

ユーザーが選択する値に応じて、いくつかのパッケージをインポートしたいとします。

デフォルトはfile1.pyです:

from files import file1 

ユーザーがfile2を選択した場合、それは次のようになります。PHPで

from files import file2 

、私はvariable variablesを使用してこの操作を行うことができます。

$file_name = 'file1'; 
include($$file_name); 
$file_name = 'file2'; 
include($$file_name); 

これをPythonでどうやって行うことができますか?

import Xは、モジュールXをインポートし、現在の名前空間でそのモジュール への参照を作成します。

+1

しないでください!入力を使用することは、通常、信頼できるものではなく、それに基づくコードを評価することは悪い考えです。 –

+0

ありがとう、私は今インポートするためにデフォルトを使用しています。 – skargor

答えて

43

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 
26

とにかく

Fredrik Lundh states:として、ここではこれらのステートメントや関数がどのように動作するかです。換言すれば、あなたはこの ステートメントを実行した後、あなたはモジュールXに定義されたものを参照するためにX.nameを使用することができます

from X import *は、モジュールXをインポートし、定義されたすべてのパブリックオブジェクトに 現在の名前空間内の参照を作成します( は、 "_"で始まる名前を持たないすべてのモジュールです)。あなたはこの文を実行した後、または 言い換えれば、あなたは単にモジュールXに定義されたものを参照するために プレーンな名前を使用することができます。しかし、それ自体をXが定義されて ないので、X.nameは動作しません。名前がすでに定義されている場合は、 が新しいバージョンに置き換えられます。そして、Xの名前が他のオブジェクトへの を指すように変更された場合、あなたのモジュールは気付かないでしょう。

from X import a, b, cは、モジュールXをインポートし、 に、指定されたオブジェクトへの現在の名前空間の参照を作成します。言い換えれば、あなたは 今、あなたのプログラムにabcを使用することができます。

最後に、あなたは1)文字列としてモジュール名を渡し、2)明示的に現在のネームスペース内の変数に にそれを割り当てる違い とimport XようX = __import__(‘X’)作品。

そして、あなたがでintrestedている最後の一つの方法だ方法によって

単純に(例えば)書く:。

var = "datetime" 
module = __import__(var) 
+0

きちんと答えてくれてありがとう。 – DrBailey

4

に相当します。パッケージはインポート時にコードを実行できるので、ユーザがシステム上でコードを任意に実行できるようになります!多く

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" 
33

旧スレッドのような何かをするより安全な、しかし、Pythonの2.7以降でこれを行うにはクリーンな方法があります他の誰かがまだ可能性があります...

ので、私は、答えを必要:

import importlib 


my_module = importlib.import_module("package.path.%s" % module_name) 
mattjbrayの答えに自分自身を基づか
+0

ヒント:[import to work](http://stackoverflow.com/a/1260813/673991)には、 'package.path .__ init __。py'が必要です。 –

2

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をプログラムで設定するか、複数のモジュールを読み込んでそれらをdictに割り当てるなどです。

関連する問題