【问题标题】:How can I set up an alias for imports in Python?如何在 Python 中为导入设置别名?
【发布时间】:2018-09-26 01:24:10
【问题描述】:

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

from my_library import sub_package

将代码用作较大项目的子包时,这些导入不起作用,因为没有全局名称 my_library。相反,我将不得不使用相对或绝对导入,例如

from large_project.my_library import sub_package

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

【问题讨论】:

  • importing behavior 是什么意思?您的意思是从子目录导入时“执行不同的功能”吗?
  • @MatrixTai 目标是使第一个框中显示的导入即使在代码用作另一个项目中的子包而不是外部依赖项时也能正常工作。我可以想象使用导入钩子来捕获所有导入,然后将 my_library 替换为 __module__.my_library 或类似的,但我不熟悉 Python 的这些很少使用的功能。
  • 如果不添加任何行(如sys.path.append()importlib.import_module)就不可能使第一个工作,就像将my_library 放入另一个项目时,python 将其视为module 和@ 987654331@ 是submodule,如果不声明它的父级,则无法访问子模块。
  • @MatrixTai 没错。我正在寻找一个可以添加到 my_library/__init__.py 的 sn-p,当它作为子包使用时,无需手动转换所有内部包含。

标签: python-3.x python-2.7 python-import


【解决方案1】:

感谢@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/__init__.pymy_library 并从那里导航到其父方向,导入将在其中找到库。

【讨论】:

  • 如何让PyCharm也懂?
【解决方案2】:

你别无选择。

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


1:添加系统路径。就像您通过pip 安装的那些模块一样。 pip 模块安装在 /Python/Scripts 中。您可以添加新路径或简单地将my_library.py 放入其中一个路径。要添加,那就是Computer(right-click)-> Properties -> Environment Variable -> Choose Path and Click Edit

(虽然你可能不想用这个。)


2:更改了__init__.py,但仍必须在my_library.py 中添加至少一行。

例如,

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

在main_init中,

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

由于执行main.py时没有执行main_init(这是假的),所以在main.py中

import __init__
from my_library import sub_package

但是你也可以把这个main_init作为库的启动器,比如声明__all__

【讨论】:

    猜你喜欢
    • 2017-01-09
    • 2019-10-04
    • 2021-04-09
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2017-12-14
    相关资源
    最近更新 更多