考虑这个简单的文件夹结构:
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()
主.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
,因为它强烈地绑定(bind)了关于包位置的假设 inside 代码文件。有什么解决办法吗? - 我也不喜欢
import package1.y as y
中多余的as y
部分。有什么解决办法吗?
最佳答案
一如既往,有两个独立的步骤:
- 您针对包的抽象 命名空间编写代码,其中包含
package1
和package2
(和sys
、os
、等),但不是“示例”,它不是包(因为main.py
不是模块)。 - 你设置了
sys.path
在您的任何代码运行之前适本地。如果是您自己的(未安装的)代码,则有 places you can put it ,或者您可以编写一个简单的 shell 脚本包装器来设置PYTHONPATH
为你的python
过程。
所以你的问题的答案是
- 在
x.py
你写from . import y
. (Python 2 支持这个,Python 3 需要它。) - 如何设置
sys.path
取决于您的包装/环境系统。传统的方法是设置PYTHONPATH
python
的环境变量过程,但还有其他方法涉及site
之类的事情模块。 -
from package1 import y
是仅命名事物一次的通常方式。
关于python - 在 Python 3 包和脚本中导入的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50185897/