【发布时间】:2018-10-15 14:08:03
【问题描述】:
考虑这个简单的文件夹结构:
root
Package1
x.py
y.py
Package2
z.py
Examples
main.py
现在我们的要求是:
- x.py需要导入y.py
- z.py需要导入y.py
- main.py需要导入y.py和z.py
以下是有效的:
x.py
import y
def x():
y()
y.py
def y():
pass
z.py
import package1.y as y
def z():
y.y()
main.py
import sys
from os import path
sys.path.append( path.dirname( path.dirname( path.abspath(__file__) ) ) )
import package1.y as y
import package2.z as z
y.y()
z.z()
问题:
- 这是在 Python 3 中设置导入的最佳和推荐方法吗?
- 我真的不喜欢在
main中更改sys.path,因为它强烈绑定了关于代码文件内部 包位置的假设。有什么办法解决吗? - 我也真的不喜欢
as y中多余的import package1.y as y部分。有什么办法解决吗?
【问题讨论】:
-
只是为了确保我理解,
root不是一个包。您有两个独立的包,分别称为Package1和Package2。sys.path选项不好,因为这意味着我无法克隆此软件包的不同副本以进行开发。我认为最好的选择是为每个包创建setup.py文件并使其可安装。现在有人可以安装、安装到 virtualenv 中,或者在任何测试之外设置他们自己的路径到他们碰巧使用它们的地方。为只想安装的最终用户提供便利。 -
...但对于有一点额外知识的开发人员来说也很容易使用它们。
-
x.py可以做到import .y但z.py是在一个完全独立的包中。它需要完整的Package1.y。 -
是的,root 不是包。问题是在开发过程中源代码在磁盘上的外观如何?
-
好问题!每个人都有自己的源存储库并且彼此之间没有任何硬编码关系,这是很常见的。用户可以
pip install他们,开发人员可以pip install --editable或pip install --develop他们。即使它们出于其他原因在同一个存储库中,它们仍然是独立的 python 实体。 (当然这都是我的拙见)
标签: python packages python-import