如何为Python中的导入设置别名?

时间:2018-09-26 01:24:11

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

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

from my_library import sub_package

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

from large_project.my_library import sub_package

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

2 个答案:

答案 0 :(得分:1)

您没有太多选择。

如果您想在任何地方引用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__等。

答案 1 :(得分: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并从那里导航到其父目录,导入将在该目录中找到该库。