如何引用文件名包含点的Python包
我正在使用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_module
和imp.load_module
的说明文档。