代码之家  ›  专栏  ›  技术社区  ›  danijar

如何在python中设置导入别名?

  •  0
  • danijar  · 技术社区  · 6 年前

    我希望我的项目在两种不同的情况下工作。它应该作为一个独立的库工作,也应该作为一个更大项目的子包工作。主要的用例是一个独立的库,它的内部导入应该是

    from my_library import sub_package
    

    当将代码用作大型项目的子包时,由于没有全局名称,这些导入无法工作。 my_library . 相反,我必须使用相对或绝对导入,例如

    from large_project.my_library import sub_package
    

    假设我编写了我的库,如第一个示例所示。作为大型项目的一部分运行以自动调整导入路径时,如何覆盖导入行为?

    2 回复  |  直到 6 年前
        1
  •  1
  •   MT-FreeHK    6 年前

    你别无选择。

    如果要引用 my_library.py 在任何地方,有两种方法(我知道)可以做类似的工作。


    1:添加系统路径。就像你安装的那些模块 pip . 匹普 模块安装在 /Python/Scripts . 您可以添加新路径或简单地 MyLangLaby.Py 进入其中一条路。补充一下,这是在 Computer(right-click)-> Properties -> Environment Variable -> Choose Path and Click Edit

    (尽管您可能不想使用这个。)


    2:改变 __init__.py ,但至少要添加一行 MyLangLaby.Py .

    例如,

    /Directory
       /large_project
          -__init__.py #call this sub_init
          -my_library.py
       -__init__.py #call this main_init, this fake
       -main.py
    

    在主语中,

    import sys
    sys.path.append('\\Directory\\large_project')
    

    因为在执行main.py时不会执行main_init(这是假的),所以在main.py中也是这样。

    import __init__
    from my_library import sub_package
    

    但是你也可以把这个主\u init作为库的开始,比如声明 __all__ 等。

        2
  •  1
  •   danijar    6 年前

    由于@matrixtai建议将包的父目录添加到模块路径中,我提出了这个动态解决方案。在顶部 my_library/__init__.py :

    # Make package global even if used as a sub package to enable short imports.
    import os
    import sys
    sys.path.append(os.path.dirname(os.path.dirname(__file__)))
    

    我们必须在这里导航两个目录才能从 我的库/初始版本 my_library 从那里到它的父方向,在那里导入将找到库。