代码之家  ›  专栏  ›  技术社区  ›  Shital Shah

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

  •  3
  • Shital Shah  · 技术社区  · 6 年前

    考虑以下简单的文件夹结构:

    root
      Package1
        x.py
        y.py
      Package2
        z.py
      Examples
        main.py
    

    现在我们的要求是:

    • x、 py需要导入y.py
    • z、 py需要导入y.py
    • 主要的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. 我真的不喜欢改变 sys.path 在里面 main 因为它强烈地约束了关于包位置的假设 在…内 代码文件。有什么办法吗?
    3. 我也真的不喜欢多余的 as y 参与 import package1.y as y .有什么办法吗?
    1 回复  |  直到 6 年前
        1
  •  1
  •   Davis Herring    6 年前

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

    1. 您根据 摘要 包的命名空间,其中包含 package1 package2 (和 sys ,则, os ,则, ),但不是不是包的示例(因为 main.py 不是模块)。
    2. 您已设置 sys.path 适当地 之前 您的任何代码都曾运行过。如果是您自己的(已卸载)代码,则有 places you can put it ,或者您可以编写一个简单的shell脚本包装器来设置 PYTHONPATH 为您的 python 过程

    所以你的问题的答案是

    1. 在里面 x.py 你写的 from . import y (Python 2支持此功能,而Python 3需要此功能。)
    2. 如何设置 系统。路径 取决于您的包装/环境系统。传统的方法是设置 蟒蛇 的环境变量 python 过程,但也有其他方式,如 site 单元
    3. from package1 import y 通常只命名一次。