在 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 需要导入 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
,因为它强烈地绑定了关于程序包位置的假设 inside 代码文件。有什么解决办法吗?
- 我也不喜欢
import package1.y as y
中多余的as y
部分。有什么解决办法吗?
一如既往,有两个独立的步骤:
- 您针对包的 abstract 命名空间编写代码,其中包含
package1
和 package2
(以及 sys
、os
、等),但不是包的“Examples”(因为main.py
不是模块)。
- 您在任何代码运行之前适当地设置了
sys.path
。如果是您自己的(未安装的)代码,您的 python
进程有 places you can put it, or you can write an easy shell script wrapper to set PYTHONPATH
。
所以你的问题的答案是
- 在
x.py
中你写from . import y
。 (Python 2 个支持,3 个需要。)
- 如何设置
sys.path
取决于您的 packaging/environment 系统。传统的方法是为 python
进程设置 PYTHONPATH
环境变量,但还有其他方法涉及 site
模块。
from package1 import y
是通常的命名方式。
考虑这个简单的文件夹结构:
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
,因为它强烈地绑定了关于程序包位置的假设 inside 代码文件。有什么解决办法吗? - 我也不喜欢
import package1.y as y
中多余的as y
部分。有什么解决办法吗?
一如既往,有两个独立的步骤:
- 您针对包的 abstract 命名空间编写代码,其中包含
package1
和package2
(以及sys
、os
、等),但不是包的“Examples”(因为main.py
不是模块)。 - 您在任何代码运行之前适当地设置了
sys.path
。如果是您自己的(未安装的)代码,您的python
进程有 places you can put it, or you can write an easy shell script wrapper to setPYTHONPATH
。
所以你的问题的答案是
- 在
x.py
中你写from . import y
。 (Python 2 个支持,3 个需要。) - 如何设置
sys.path
取决于您的 packaging/environment 系统。传统的方法是为python
进程设置PYTHONPATH
环境变量,但还有其他方法涉及site
模块。 from package1 import y
是通常的命名方式。