在复杂的Python项目中处理导入的正确方法是哪种?

时间:2016-04-10 08:05:31

标签: python packages python-import

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

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

假设有以下项目树:

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

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

  1. foo
  2. 导入bar
  3. foo
  4. 导入other1
  5. other1
  6. 导入other2
  7. 在开发过程中从不同的目录导入foo(这是一个库)(虚拟环境是正确的选择吗?)
  8. 谢谢!

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

1 个答案:

答案 0 :(得分:2)

1。从foo

导入bar

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

from . import foo

如果使用bar执行python bar.py,那么您也可以像其他模块一样绝对导入它:

import foo

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

2。从foo

导入other1

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

from .. import foo

3。从other1

导入other2

现在这不应该是一个惊喜,但你也可以在子包中使用相对导入和模块:

from ..subpackage1 import other1

4。在开发期间从其他目录导入foo(库)

我假设通过"一个不同的目录"你的意思是"一个不同的项目"。在这种情况下,是的,您希望将foo打包为distutils / setuptools包,然后将其安装到另一个项目的virtualenv中。

究竟如何做到这一点对于已经变得很长的帖子来说有点多了,但是setuptools网站有一个相当不错的tutorial来做这件事。