我使用Django和我有一个models.admin.py文件命名,我想做到以下几点想法models.py:如何引用Python包时,文件名中包含一段
from "models.admin" import *
然而,双引号引起的语法错误。但是,如果我只是做
from models.admin import *
然后我得到“导入错误:没有模块名为admin”
有没有办法从一个Python文件(其名称中有一段)导入?
我使用Django和我有一个models.admin.py文件命名,我想做到以下几点想法models.py:如何引用Python包时,文件名中包含一段
from "models.admin" import *
然而,双引号引起的语法错误。但是,如果我只是做
from models.admin import *
然后我得到“导入错误:没有模块名为admin”
有没有办法从一个Python文件(其名称中有一段)导入?
其实,你可以用导入一个无效名称的模块。但是,您需要使用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
的文档你开始使用它之前。
不良做法? 'imp'是'import'和'__import__'背后的机制。更大的灵活性,但需要更多的代码。尽管如此,没有什么神奇的。 – 2009-12-01 19:33:40
机器码是一切背后的机制。更多的灵活性和..看看我要去哪里? :) – shylent 2009-12-01 19:36:49
如果你真的需要使用它,你显然需要考虑一下,但我不明白如何使用它是非常错误的。 ;)它用于生产 - 参见例如Trac - http://trac.edgewall.org/browser/trunk/trac/loader.py。 – 2009-12-01 19:42:07
该文件被称为models/admin.py
。 (Source)
也就是说,它应该在名为models
的目录中调用admin.py
。
然后,您可以使用from models.admin import *
导入,假设它位于您的Python路径中。
不,您不能将python文件作为模块导入,如果它的名称包含句号(或问号或感叹号等)。一个python模块的名字(不包括.py)必须是一个有效的python名字(即可以用作变量名)。
你有这方面的参考吗? – Taras 2014-07-03 05:54:12
该引用是Python语法规范(https://docs.python.org/2/reference/grammar.html)。但是,这实际上只指定了允许导入语句的内容 - 正如上面在接受的答案中指出的那样,通过使用基础导入机制来解决此问题在技术上是可行的。 – 2014-07-04 07:12:00
如果你真的想来,你可以导入一个模块,一个不寻常的文件名(例如,“的.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”的文件;然后“导入a.b”将加载a/b.py。
'load_source'已经过时,因为至少1.5。 – 2009-12-01 19:21:37
确实如此,尽管这样做的方式非常复杂:a_b = imp.load_module('a.b',open('abpy'),os.path.abspath('abpy'), ('.py','r',imp.PY_SOURCE)) – 2009-12-01 20:41:41
HELLO HELLO什么是**强制**你有一个文件名像models.admin.py ??为什么不把它称为models_admin.py或models/admin。py或者其他适合Django的东西? – 2009-12-01 20:47:32
请不要这样做。 – 2009-12-01 20:57:42
从技术上讲,这是一个模块,而不是一个包。 – Cerin 2013-05-01 15:10:14