我的情况与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路径中...
答案 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'))
但是,除非在重命名后你需要更改很多东西,否则我建议你重命名。