2009-12-01 80 views
27

我使用Django和我有一个models.admin.py文件命名,我想做到以下几点想法models.py:如何引用Python包时,文件名中包含一段

from "models.admin" import * 

然而,双引号引起的语法错误。但是,如果我只是做

from models.admin import * 

然后我得到“导入错误:没有模块名为admin”

有没有办法从一个Python文件(其名称中有一段)导入?

+7

HELLO HELLO什么是**强制**你有一个文件名像models.admin.py ??为什么不把它称为models_admin.py或models/admin。py或者其他适合Django的东西? – 2009-12-01 20:47:32

+7

请不要这样做。 – 2009-12-01 20:57:42

+1

从技术上讲,这是一个模块,而不是一个包。 – Cerin 2013-05-01 15:10:14

回答

23

其实,你可以用导入一个无效名称的模块。但是,您需要使用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的文档你开始使用它之前。

+3

不良做法? 'imp'是'import'和'__import__'背后的机制。更大的灵活性,但需要更多的代码。尽管如此,没有什么神奇的。 – 2009-12-01 19:33:40

+5

机器码是一切背后的机制。更多的灵活性和..看看我要去哪里? :) – shylent 2009-12-01 19:36:49

+1

如果你真的需要使用它,你显然需要考虑一下,但我不明白如何使用它是非常错误的。 ;)它用于生产 - 参见例如Trac - http://trac.edgewall.org/browser/trunk/trac/loader.py。 – 2009-12-01 19:42:07

4

该文件被称为models/admin.py。 (Source

也就是说,它应该在名为models的目录中调用admin.py

然后,您可以使用from models.admin import *导入,假设它位于您的Python路径中。

2

不,您不能将python文件作为模块导入,如果它的名称包含句号(或问号或感叹号等)。一个python模块的名字(不包括.py)必须是一个有效的python名字(即可以用作变量名)。

+0

你有这方面的参考吗? – Taras 2014-07-03 05:54:12

+2

该引用是Python语法规范(https://docs.python.org/2/reference/grammar.html)。但是,这实际上只指定了允许导入语句的内容 - 正如上面在接受的答案中指出的那样,通过使用基础导入机制来解决此问题在技术上是可行的。 – 2014-07-04 07:12:00

0

你是不是引用文件在import语句,您引用模块

请阅读docs,他们对此非常清楚。

无论如何,由于您使用的是django,通常的方法将无法正常工作。如果要将模型保存在单独的文件中而不是models.py中,则必须采取额外的步骤,例如here

编辑:
那么,我不知道问题的意思,当他提到管理员和它是否与django的管理界面有关。我的观点依然存在。

+1

模块是一个文件。引用你引用的文档:“为了支持这个,Python有一种方法可以将定义放在一个文件中,并将它们用在脚本或解释器的交互式实例中。这样的文件被称为模块;' – 2013-05-01 21:41:22

10

如果你真的来,你可以导入一个模块,一个不寻常的文件名(例如,“的.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。

+1

'load_source'已经过时,因为至少1.5。 – 2009-12-01 19:21:37

+0

确实如此,尽管这样做的方式非常复杂:a_b = imp.load_module('a.b',open('abpy'),os.path.abspath('abpy'), ('.py','r',imp.PY_SOURCE)) – 2009-12-01 20:41:41

相关问题