如何引用文件名包含点的Python包

56 投票
7 回答
37425 浏览
提问于 2025-04-15 16:34

我正在使用Django框架,手里有一个叫做models.admin.py的文件。我想在models.py文件里实现一个想法:

from "models.admin" import *

但是我遇到了语法错误,因为我用了双引号。如果我只写成

from models.admin import *

那我就会收到一个错误提示:“ImportError: No module named admin”(找不到名为admin的模块)

有没有办法从一个名字里带有点(.)的Python文件中导入内容呢?

7 个回答

4

这个文件叫做 models/admin.py。(来源

也就是说,它应该放在一个叫 models 的文件夹里,文件名是 admin.py

然后你可以用 from models.admin import * 来导入它,前提是这个文件在你的Python路径中。

15

如果你真的想要的话,可以通过imp模块导入一个名字比较奇怪的模块(比如,文件名中在“.py”之前还有一个“.”)。

>>> import imp
>>> a_b = imp.load_source('a.b', 'a.b.py')
>>> a_b.x
"I was defined in a.b.py!"

不过,这样做通常不是个好主意。你更有可能是想使用包,这种情况下你应该创建一个名为“a”的文件夹,里面放一个叫“b.py”的文件;然后用“import a.b”就能加载a/b.py这个文件了。

43

其实,你是可以导入一个名字不合法的模块的。不过,你需要用到imp这个工具。比如说,如果文件名是models.admin.py,你可以这样做:

import imp
with open('models.admin.py', 'rb') as fp:
    models_admin = imp.load_module(
        'models_admin', fp, 'models.admin.py',
        ('.py', 'rb', imp.PY_SOURCE)
    )

不过在开始使用之前,最好先看看imp.find_moduleimp.load_module的说明文档。

撰写回答