【问题标题】:Clashing imports between Python modulesPython模块之间的冲突导入
【发布时间】:2021-09-29 06:44:38
【问题描述】:

我的目录结构如下:

.
├── main.py
├── package
│   ├── module.py
│   └── utils.py
└── utils.py

package 内部,我有(很多)代码,其中所有导入都与package 相关,例如package/module.py 包含 import utils,它希望导入 package/utils.py(而不是 utils.py)。

package 之外的所有代码都要求导入相对于根目录 .

这对我来说是个问题,因为如果main.py 包含import package.module 而我有PYTHONPATH=.,那么package/module.py 最终会导入utils.py 而不是所需的package/utils.py(因为它包含import utils )。

如何在不重命名脚本的情况下解决此问题?我想以某种方式在package 中安装代码,这样我就可以在main.py 中导入它,而不会与我的其他文件发生冲突。

我尝试了什么:我在package 中添加了一个最小的setup.py 文件并运行pip install -e .,但这并没有解决问题。

非常感谢您的帮助!

【问题讨论】:

  • 只是一个建议 - 更具描述性地命名你的包和模块 - 对不同的文件使用相同的文件名会让人困惑,因为 f**ck :)
  • 谢谢!我同意描述性命名,但像utils.py 这样的文件往往位于包含该文件夹实用程序的各种文件夹中。尽管如此,package/ 中的代码是第三方代码,它的命名当然不在我的控制范围内......我希望有一个解决方案,您可以在 @ 中“打包”第三方代码987654344@ 无需重命名或编辑其中的代码以避免命名冲突...

标签: python python-import python-packaging pythonpath


【解决方案1】:

您是否尝试过子模块的相对导入?

所以一般你会使用

import utils  # Import ./utils.py
import .utils # Import relative ./<eg. package>/utils.py

这将导致“包”下的脚本始终导入其本地 utils.py

【讨论】:

  • 感谢您的建议!我希望有一个解决方案,我不必重命名或编辑package/ 中的任何代码,因为其中有很多(它是第三方代码)。我想知道我是否可以改为“打包”package/,这样它就不会与我的代码交互/冲突。
  • 你能想到我怎样才能把package/里面的文件夹变成一个不与其他代码交互的包吗?我最近一直想知道setuptools.setuppackage_dirpackages 参数是否值得玩来实现这一目标?
猜你喜欢
  • 2013-06-15
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 2011-08-21
  • 2016-04-30
  • 2015-10-25
  • 1970-01-01
相关资源
最近更新 更多