导入与系统模块具有相同名称的模块

时间:2011-08-18 11:51:11

标签: python django importerror pythonpath

我的情况与this question...中的情况类似,区别在于

在我们的python / django项目中,我们有一个名为 utils 的目录,它保留了基本功能......

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

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时,它会失败......

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

2 个答案:

答案 0 :(得分:6)

有关语义,请参阅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)引用它。

答案 1 :(得分:-1)

我不打算告诉您尝试确保在stdlib模块之后没有为自己的模块命名;

如果你想保留这样的名字,你必须在导入你自己的utils模块的所有东西中使用这样的东西:

import sys, imp

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

但是,除非在重命名后你需要更改很多东西,否则我建议你重命名。