50

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

デフォルトはfile1.py

from files import file1

ユーザーが選択file2した場合、次のようになります。

from files import file2

PHPでは、変数変数を使用してこれを行うことができます。

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

Pythonでこれを行うにはどうすればよいですか?

4

5 に答える 5

74

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
于 2011-07-13T10:29:33.313 に答える
45

古いスレッドですが、答えが必要だったので、他の誰かがまだ...

Python2.7以降でこれを行うためのよりクリーンな方法があります。

import importlib


my_module = importlib.import_module("package.path.%s" % module_name)
于 2013-05-07T16:28:11.507 に答える
38

Fredrik Lundhが述べているように

とにかく、これらのステートメントと関数がどのように機能するかを次に示します。

import XモジュールXをインポートし、現在の名前空間にそのモジュールへの参照を作成します。つまり、このステートメントを実行した後X.name、モジュールXで定義されたものを参照するために使用できます。

from X import *モジュールXをインポートし、現在の名前空間に、そのモジュールによって定義されたすべてのパブリックオブジェクト(つまり、「_」で始まる名前を持たないすべてのもの)への参照を作成します。つまり、このステートメントを実行した後は、単純な名前を使用して、モジュールXで定義されているものを参照できます。ただし、X自体は定義されていないため、X.name機能しません。また、名前がすでに定義されている場合は、新しいバージョンに置き換えられます。また、Xの名前が他のオブジェクトを指すように変更された場合、モジュールは気づきません。

from X import a, b, cモジュールXをインポートし、現在の名前空間に指定されたオブジェクトへの参照を作成します。つまり、プログラムでandをa使用できるようにbなりました。c

最後に、X = __import__(‘X’)のようimport Xに機能しますが、1)モジュール名を文字列として渡し、2)現在の名前空間の変数に明示的に割り当てるという違いがあります。

ちなみに、これがあなたが興味を持っている最後の方法です。

単に書く(例えば):

var = "datetime"
module = __import__(var)
于 2011-07-13T10:27:52.410 に答える
6

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プログラムで設定したり、複数のモジュールをロードしてそれらをdictに割り当てることができます。

于 2013-11-21T02:12:39.283 に答える
5

インポートするものをユーザーに選択させるのは、おそらく非常に悪い考えです。パッケージはインポート時にコードを実行できるため、ユーザーがシステム上で任意にコードを実行できるようになります。次のようなことをする方がはるかに安全です

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"
于 2011-07-13T10:32:06.773 に答える