【问题标题】:Importing a module which have the same name with a system module导入与系统模块同名的模块
【发布时间】:2011-10-29 17:39:00
【问题描述】:

我的情况和this question...中的一个类似,不同的是,

在我们的python/django项目中,我们有一个名为utils的目录,里面保存着基本的功能……

有时,我们需要通过从控制台运行 thm 来测试一些模块,例如

python myproject/some_module.py

一切都很好,直到 python 尝试从 我们的 utils 目录中导入一些东西...

from utils.custom_modules import some_function
ImportError: No module named custom_modules

我检查了我的python路径,我们的项目在列表中,项目文件下的每个文件夹都有__init__.py文件,当我在项目目录中运行ipython时...一切正常, 否则,python 从它自己的 utils 目录导入...

我的同事使用 sama 方法没有任何问题,但它会在我的环境中抛出 ImportError...我们所有人都缺少的问题可能是什么?

更新:我的项目目录和每个子目录都有__init__.py 文件,我可以毫无问题地从我的项目中导入其他模块......当我在与我的procekt不同的文件夹中并且我运行ipython时,这样的导入没有问题...

from someothermodule.submodule imprort blahblahblah

但是,当涉及到导入 utils 时,它会失败...

UPATE 2:导致问题的原因是 django 文件夹下的 utils 目录,它也在 python 路径中...

【问题讨论】:

  • 你试过from .utils.custom_modules import some_function
  • ValueError: Attempted relative import in non-package 错误...
  • 通过添加一个空的__init__.py 将你的django 项目变成一个包。如果你想做一个相对导入,你已经把它当成一个包了,把它做成一个包是合适的。
  • 项目目录也有一个__init__.py 文件,一个空的...但是据我所知,这对于python 将其视为python 目录来说已经足够了...
  • utils 目录是否有__init__.py?它也需要是一个子包。模块的每个目录都被用作一个包,需要制作一个。

标签: python django importerror pythonpath


【解决方案1】:

有关语义,请参阅PEP on absolute and relative imports。你可能想要

from .utils.custom_modules import some_function

如果您在包顶层的文件中。

编辑:这只能在包内完成。这是有充分理由的——如果您要导入项目的一部分,那么您已经将它视为一个 Python 包,您实际上应该将其作为一个包。为此,您可以将__init__.py 文件添加到项目目录。

编辑 2:您已经完全改变了问题。有可能解决这个问题,但正确的做法是不要像内置包一样引用您的打包方式。您要么需要重命名utils,要么将其设为另一个包的子包,这样您就可以使用不冲突的名称(如from mydjangoapp.utils.custom_modules import some_function)来引用它。

【讨论】:

    【解决方案2】:

    我不会费心告诉您尝试确保您没有在 stdlib 模块之后命名您自己的模块;

    如果您想保留这样的名称,则必须在导入您自己的 utils 模块的所有内容中使用类似的名称:

    import sys, imp
    
    utils = sys.modules.get('utils')
    if not utils: utils = imp.load_module('utils',*imp.find_module('utils/utils'))
    

    但是,除非重命名后有很多内容需要更改,否则我建议您重命名。

    【讨论】:

    • 这绝对是错误的做法。这就是相对导入的用途。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    相关资源
    最近更新 更多