导入与系统模块同名的模块

发布于 2024-11-30 11:48:21 字数 1011 浏览 1 评论 0原文

我的情况与 这个问题... 中的情况类似,不同的是,

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

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

python myproject/some_module.py

It is all good,直到 python 尝试从 our 导入某些内容strong> 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目录,该目录也在蟒蛇路径...

My situation is similar to one in this question... The difference is,

In our python/django project, we have a directory called utils, which keeps basic functions...

Sometimes, we need to test some modules by running thm from console like

python myproject/some_module.py

It is all good, until python tries to import something from our utils directory...

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

I check my python path, and our project is on the list, each folder under the project file has __init__.py files, and when i run ipython within project directory... Everything is ok, otherwise, python imports from its own utils directory...

My collegues use the sama method without any problem, but it throws ImportError on my environment... What could be the problem that all of us was missing?

UPDATE: My project directory, and each sub-drectory have __init__.py file, and i can import other modules from my project without any problem... When i am in a diffrent folder than my procekt and i run ipython, a such import have no problem...

from someothermodule.submodule imprort blahblahblah

But, when it comes to importing utils, it fails...

UPATE 2: What caused the problem was the utils directory under django folder, which is also in the python path...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

铁轨上的流浪者 2024-12-07 11:48:21

请参阅关于绝对和相对导入的 PEP语义。 您可能需要这样做

from .utils.custom_modules import some_function

如果您位于包顶层的文件中,

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

编辑2:你已经完全改变了问题。也许可以解决这个问题,但正确的做法是不要以与内置包相同的方式引用您的包。您需要重命名 utils,或者将其设为另一个包的子包,这样您就可以通过不冲突的名称来引用它(例如 mydjangoapp.json 中的 )。 utils.custom_modules import some_function)。

See the PEP on absolute and relative imports for the semantics. You probably want

from .utils.custom_modules import some_function

if you're in a file at the top level of your package.

Edit: This can only be done from inside a package. This is for a good reason -- if you're importing something that is part of your project, then you're already treating it like a Python package, and you should actually make it one. You do this by adding an __init__.py file to project directory.

Edit 2: You've completely changed the question. It may be possible to work around the problem, but the correct thing to do is not refer to your packed the same way as a builtin package. You either need to rename utils, or make it a subpackage of another package, so you can refer to it by a non-conflicting name (like from mydjangoapp.utils.custom_modules import some_function).

虐人心 2024-12-07 11:48:21

我不会费心告诉您尝试并确保不要以 stdlib 模块命名您自己的模块;

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

import sys, imp

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

但是,除非重命名后必须更改很多内容,否则我会建议你重命名它。

I'm not going to bother telling you to try and make sure you don't name your own modules after the stdlib modules;

If you want to leave the name like this, you'll have to use something like this in everything that imports your own utils module:

import sys, imp

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

However, unless there's a lot of stuff that you'd have to change after renaming it, I'd suggest you rename it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文