3

我的情况与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

但是,当涉及到导入实用程序时,它失败了......

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

4

2 回答 2

6

有关语义,请参阅绝对和相对导入的 PEP 。你可能想要

from .utils.custom_modules import some_function

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

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

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

于 2011-08-18T12:06:55.727 回答
-1

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

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

import sys, imp

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

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

于 2011-08-18T12:02:45.117 回答