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

标签 python package python-import

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

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()

问题:

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

最佳答案

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

  1. 您针对包的抽象 命名空间编写代码,其中包含package1package2 (和 sysos),但不是“示例”,它不是包(因为 main.py 不是模块)。
  2. 你设置了sys.path在您的任何代码运行之前适本地。如果是您自己的(未安装的)代码,则有 places you can put it ,或者您可以编写一个简单的 shell 脚本包装器来设置 PYTHONPATH 为你的 python过程。

所以你的问题的答案是

  1. x.py你写from . import y . (Python 2 支持这个,Python 3 需要它。)
  2. 如何设置 sys.path取决于您的包装/环境系统。传统的方法是设置 PYTHONPATH python 的环境变量过程,但还有其他方法涉及 site 之类的事情模块。
  3. from package1 import y是仅命名事物一次的通常方式。

关于python - 在 Python 3 包和脚本中导入的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50185897/

相关文章:

javascript - 预期的 str 实例,发现 BoundField (Django)

ruby - 如何使用 native 扩展重新打包 ruby​​ gem

python - 从包内的父目录导入模块

python - 我应该在包中包含非 Python 文件吗?

Python模拟504网关超时错误

git - 使用 git 子模块还原 Nuget 包

python - 当文件名包含句点时如何引用python包

python-3.x - 如何简化我的导入

python - 类型错误 : unsupported operand type(s) for +: 'dict_items' and 'dict_items'

scala - 包对象什么时候初始化?