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

旧线程,但我需要答案,所以其他人仍然可能......

在 Python 2.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它不起作用。如果 name 已定义,则将其替换为新版本。如果 X 中的名称更改为指向其他对象,您的模块将不会注意到。

from X import a, b, c导入模块 X,并在当前命名空间中创建对给定对象的引用。或者换句话说,你现在可以在你的程序中使用aand了。bc

最后,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编程方式设置,或加载多个模块并将它们分配给一个字典。

于 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 回答