如何在Python中像PHP中使用变量变量($$)一样导入变量包?

53 投票
5 回答
56943 浏览
提问于 2025-04-16 21:25

我想根据用户选择的值来导入一些包。

默认情况下是 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中该怎么做呢?

5 个回答

39

正如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)
46

这是个老帖子,但我需要这个答案,所以可能还有其他人也需要...

在Python 2.7及以上版本中,有一种更简洁的方法来做到这一点:

import importlib


my_module = importlib.import_module("package.path.%s" % module_name)
81

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

撰写回答