考虑这个简单的文件夹结构:
现在我们的要求是:
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
,因为它强烈绑定了有关代码文件内部包位置的假设。有没有办法解决这个问题? - 我也非常不喜欢
import package1.y as y
中多余的as y
部分。有没有办法解决这个问题?
root
不是一个包。你有两个独立的包叫做Package1
和Package2
。sys.path
选项不好,因为这意味着我不能克隆不同的副本来进行开发。我认为最好的选择是为每个包创建setup.py
文件并使它们可安装。现在,某人可以安装、安装到虚拟环境中,或者在任何测试之外设置自己的路径,以便无论他们在哪里使用它们都能方便地安装。让终端用户轻松安装。 - tdelaneyx.py
可以使用import .y
,但z.py
在一个完全不同的包中。它需要完整的Package1.y
。 - tdelaneypip install
安装它们,而开发人员则可以使用pip install --editable
或pip install --develop
安装它们。即使它们在同一个代码库中,它们仍然是独立的 Python 实体。(当然,这只是我的个人意见) - tdelaney