我一直使用
Python作为单文件脚本,现在我正在开发我的第一个“复杂”项目,所以我没有使用Python(3.x)的软件包.
我知道这是一个经常被问到的问题,但是我错过了在我的项目中成功组织模块导入的东西,它应该用作库.
假设以下项目树:
myProject/
- subpackage1/
- __init__.py
- other1.py
- subpackage2/
- __init__.py
- other2.py
- __init__.py
- foo.py
- bar.py
哪个是相互导入模块的正确方法?特别是:
>从bar导入foo
>从other1导入foo
>从other2导入other1
>在开发期间从不同的目录导入foo(这是一个库)(虚拟环境是正确的选择吗?)
谢谢!
编辑:(使问题更具体)我在问之前显然尝试了不同的方法.我在一些热门项目中看到的是使用绝对导入,例如myProject.subpackage1.other1导入的东西.它看起来像一个干净的解决方案(类似于我以前在Java中所做的),但是当采用这种方法时,由于导入错误,我不能简单地运行我的代码. virtualenv是否可以在尝试导入软件包之前安装软件包?
最佳答案 1.从bar导入foo
正如the tutorial所说,您可以通过从…导入来从同一目录导入模块.例如:
from . import foo
如果使用python bar.py执行bar,那么你也可以像任何其他模块一样绝对地导入它:
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这样做.