web-dev-qa-db-ja.com

PHPで変数変数($$)を使用する場合のように、変数パッケージをPythonでインポートするにはどうすればよいですか?

ユーザーが選択した値に応じてパッケージをインポートしたい。

デフォルトは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でこれを行うにはどうすればよいですか?

36
skargor

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
55
Jeremy Banks

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

Python 2.7+:

import importlib


my_module = importlib.import_module("package.path.%s" % module_name)
35
Dan Copeland

As Fredrik Lundhの状態:

とにかく、これらのステートメントと関数の仕組みは次のとおりです。

_import X_はモジュールXをインポートし、現在のネームスペースにそのモジュールへの参照を作成します。または、言い換えると、このステートメントを実行した後、_X.name_を使用してモジュールXで定義されたものを参照できます。

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

_from X import a, b, c_はモジュールXをインポートし、現在のネームスペースに指定されたオブジェクトへの参照を作成します。または、言い換えると、プログラムでabcを使用できるようになりました。

最後に、X = __import__(‘X’)は_import X_と同じように機能しますが、1)モジュール名を文字列として渡し、2)変数に明示的に割り当てます。現在のネームスペースで。

そして、それがあなたが興味を持っている最後の方法です。

単に書く(例えば):

_var = "datetime"
module = __import__(var)
_
28
Gandi

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

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"
4
mattjbray

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プログラムで、または複数のモジュールをロードして、たとえば、それらを辞書に割り当てます。

3
sleblanc