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

Ale*_*ird 37 python import module package python-import

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

from "models.admin" import *
Run Code Online (Sandbox Code Playgroud)

但是,我得到双引号的语法错误.但是如果我这样做的话

from models.admin import *
Run Code Online (Sandbox Code Playgroud)

然后我得到"ImportError:没有名为admin的模块"

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

Cat*_*lus 27

实际上,您可以导入名称无效的模块.但你需要使用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)
    )
Run Code Online (Sandbox Code Playgroud)

但是在开始使用它之前imp.find_moduleimp.load_module之前阅读文档.

  • 而机器代码是一切背后的机制.更灵活,..看看我要去哪里?:) (7认同)
  • 不好的做法?`imp`是`import`和`__import__`背后的机制.更灵活,但需要更多代码.但是,没有什么神奇的. (3认同)
  • 如果你真的需要使用它,你显然需要三思而后行,但我不知道如何使用它是非常错误的.;)它用于生产 - 参见例如Trac - http://trac.edgewall.org/browser/trunk/trac/loader.py. (2认同)
  • 为了记录,我从未真正命名我的文件,我意识到这将是复杂的.但是在谷歌搜索出于好奇心而没有找到答案之后,我决定我希望将答案(导入imp)和接受实践的声音(不要使用它)存档给未来的Google员工.:) (2认同)
  • 我认为重要的一点是,根据 python 样式指南,这是一个无效的模块名称:http://www.python.org/dev/peps/pep-0008/。但是,在 OP 的情况下,如果模块名称无法更改,则此解决方案似乎是合理的,因为它使用了记录良好的接口。换句话说,未来的 Python 次要版本不太可能改变这种行为。如果解决方案涉及未记录的功能,那就是另一回事了,我会同意害羞的。 (2认同)

Edw*_*per 12

如果你真的想,你可以使用imp模块导入一个具有不寻常文件名的模块(例如,在'.py'之前包含'.'的文件名):

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

然而,这通常是个坏主意.你更有可能尝试使用包,在这种情况下你应该创建一个名为"a"的目录,其中包含一个名为"b.py"的文件; 然后"import ab"将加载a/b.py.

  • 由于至少1.5,因此load_source已过时。 (2认同)

Mar*_*ers 5

该文件名为models/admin.py. (来源

也就是说,它应该admin.py在名为models.

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