我希望我的项目在两种不同的情况下工作。它应该作为一个独立的库,也可以作为较大项目的子包。主要用例是一个独立的库,其内部导入应采用以下形式
from my_library import sub_package
将代码用作较大项目的子包时,这些导入将不起作用,因为没有全局名称my_library
。相反,我将不得不使用相对或绝对导入,例如
from large_project.my_library import sub_package
假设我按照第一个示例所示编写了我的库。作为较大项目的一部分运行时,如何覆盖导入行为以自动调整导入路径?
答案 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__.py
到my_library
并从那里导航到其父目录,导入将在该目录中找到该库。