当文件名包含句点时如何引用python包

当文件名包含句点时如何引用python包,python,import,module,package,python-import,Python,Import,Module,Package,Python Import,我正在使用django,我有一个名为models.admin.py的文件,我想在models.py中实现以下想法: from "models.admin" import * 但是,使用双引号会导致语法错误。但如果我这么做的话 from models.admin import * 然后我得到“ImportError:没有名为admin的模块” 有没有办法从名称中有句点的python文件导入?该文件名为models/admin.py。() 也就是说,它应该在名为models的目录中被称为admi

我正在使用django,我有一个名为models.admin.py的文件,我想在models.py中实现以下想法:

from "models.admin" import *
但是,使用双引号会导致语法错误。但如果我这么做的话

from models.admin import *
然后我得到“ImportError:没有名为admin的模块”


有没有办法从名称中有句点的python文件导入?

该文件名为
models/admin.py
。()

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


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

否,如果Python文件的名称包含句点(或问号或感叹号等),则无法将其作为模块导入。python模块的名称(不包括.py)必须是有效的python名称(即可以用作变量名)。

您在导入语句中没有引用文件,而是引用模块和包

请看报纸,他们对那件事很清楚

无论如何,因为您使用的是django,所以通常的方法不起作用。如果要将模型保存在单独的文件中,而不是保存在models.py中,则必须执行额外的步骤,例如,概述

编辑:
嗯,我真的不知道提问者在提到admin时是什么意思,以及它是否与django的admin接口有关。我的观点仍然有效。

如果您确实想要,您可以使用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”的文件;然后“导入a.b”将加载a/b.py。

实际上,您可以导入名称无效的模块。但您需要使用,例如,假设文件名为
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)
    )

但是,在开始使用之前,请阅读文档。

load_source
已经过时,因为至少1.5.True,尽管非过时的方式有点冗长:a_b=imp.load_模块('a.b',open('a.b.py')、os.path.abspath('a.b.py')、('.py','r',imp.py_source糟糕的做法<代码>导入是
导入
导入
背后的机制。更灵活,但需要更多的代码。不过,这并没有什么神奇之处。机器代码是一切背后的机制。更具灵活性和。。看到我要去哪里了吗?:)如果你真的需要使用它,你显然需要三思而后行,但我不认为使用它是多么的错误它被用于生产中,比如说Trac,我从来没有在意识到这会很复杂的那一刻给我的文件命名过。但在出于好奇进行谷歌搜索并未能找到答案后,我决定将答案(导入imp)和公认实践之声(不要使用)存档,以供未来的谷歌用户使用。:)我认为重要的一点是,根据python样式指南,这是一个无效的模块名:。然而,在OP的情况下,若模块名不能更改,这个解决方案似乎是合理的,因为它使用了有良好文档记录的接口。换句话说,未来的python小版本不太可能改变这种行为。如果解决方案涉及未记录的特性,那是另一回事,我会同意shylent。从技术上讲,这是一个模块,而不是一个包。模块是一个文件。引用您引用的文档:
为了支持这一点,Python有一种方法将定义放入文件中,并在脚本或解释器的交互式实例中使用它们。这样的文件称为模块你手头有参考资料吗?参考资料是Python语法规范()。然而,这实际上只指定了import语句所允许的内容——正如上面在接受的答案中指出的,从技术上讲,可以通过使用底层的导入机制来解决这个问题。对于包含多个单词的长名称,最好的模式是什么?命名包以及文件夹“awesome.project”会产生问题,而“awesomeProject”似乎是一种反模式。不确定我是否正确理解此规则: