gpt4 book ai didi

python - 在复杂的 Python 项目中处理导入的正确方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 11:24:39 25 4
gpt4 key购买 nike

我一直将 Python 用于单文件脚本,现在我正在处理我的第一个“复杂”项目,所以我没有使用 Python (3.x) 中的包的经验。

我知道这是一个经常被问到的问题,但我缺少在我的项目中成功组织模块导入的一些东西,它应该被用作一个库。

假设以下项目树:

myProject/
- subpackage1/
- __init__.py
- other1.py
- subpackage2/
- __init__.py
- other2.py
- __init__.py
- foo.py
- bar.py

相互导入模块的正确方法是什么?特别是:

  1. bar 导入 foo
  2. other1 导入 foo
  3. other2导入other1
  4. 在开发期间从不同的目录导入 foo(这是一个库)(虚拟环境是正确的选择吗?)

谢谢!

编辑:(使问题更具体)我在提问之前显然尝试了不同的方法。我在一些流行的项目中看到的是使用绝对导入,例如 from myProject.subpackage1.other1 import something。它看起来像是一个干净的解决方案(类似于我以前在 Java 中所做的),但是当采用这种方法时,由于导入错误,我不能简单地运行我的代码。 virtualenv 能否成为在尝试导入包之前安装包的解决方案?

最佳答案

1。从 bar

导入 foo

作为the tutorial说,您可以通过导入 from . 从同一目录导入模块。例如:

from . import foo

如果 bar 是用 python bar.py 执行的,那么你也可以绝对导入它,就像任何其他模块一样:

import foo

这是有效的,因为已执行文件的父目录已添加到模块搜索路径 ( sys.path/PYTHONPATH )。但是,我不会依赖这种行为,因为它对导入模块和主模块意味着不同的事情。

2。从 other1

导入 foo

如果您使用相对导入语法,那么您可以添加另一个 . 来表示父目录:

from .. import foo

3。从 other2

导入 other1

现在这应该不足为奇了,但是您也可以在子包中对模块使用相对导入:

from ..subpackage1 import other1

4。在开发期间从不同的目录导入 foo(一个库)

我假设“不同的目录”是指“不同的项目”。在那种情况下,是的,您需要将 foo 打包为 distutils/setuptools 包,然后将其安装到另一个项目的 virtualenv 中。

对于一篇已经很长的帖子来说,具体如何做到这一点有点复杂,但是 setuptools 网站有一个相当不错的 tutorial为此。

关于python - 在复杂的 Python 项目中处理导入的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36527378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com