在 Python 3 个包和脚本中导入的最佳实践

Best practises for imports in Python 3 packages and scripts

考虑这个简单的文件夹结构:

root
  Package1
    x.py
    y.py
  Package2
    z.py
  Examples
    main.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()

问题:

  1. 这是在 Python 3 中设置导入的最佳推荐方法吗?
  2. 我真的不喜欢在 main 中更改 sys.path,因为它强烈地绑定了关于程序包位置的假设 inside 代码文件。有什么解决办法吗?
  3. 我也不喜欢import package1.y as y中多余的as y部分。有什么解决办法吗?

一如既往,有两个独立的步骤:

  1. 您针对包的 abstract 命名空间编写代码,其中包含 package1package2(以及 sysos),但不是包的“Examples”(因为main.py不是模块)。
  2. 您在任何代码运行之前适当地设置了sys.path。如果是您自己的(未安装的)代码,您的 python 进程有 places you can put it, or you can write an easy shell script wrapper to set PYTHONPATH

所以你的问题的答案是

  1. x.py中你写from . import y。 (Python 2 个支持,3 个需要。)
  2. 如何设置 sys.path 取决于您的 packaging/environment 系统。传统的方法是为 python 进程设置 PYTHONPATH 环境变量,但还有其他方法涉及 site 模块。
  3. from package1 import y 是通常的命名方式。