Python 3.x 如何在Python中为导入设置别名?
我希望我的项目在两种不同的情况下工作。它应该作为一个独立的库工作,但也可以作为一个更大项目的子包。主要用例是独立库,其内部导入应为Python 3.x 如何在Python中为导入设置别名?,python-3.x,python-2.7,python-import,Python 3.x,Python 2.7,Python Import,我希望我的项目在两种不同的情况下工作。它应该作为一个独立的库工作,但也可以作为一个更大项目的子包。主要用例是独立库,其内部导入应为 from my_library import sub_package 将代码用作较大项目的子包时,这些导入不起作用,因为没有全局名称my_库。例如,我必须使用相对或绝对导入 from large_project.my_library import sub_package 假设我编写了我的库,如第一个示例所示。作为较大项目的一部分运行时,如何覆盖导入行为以自动调整
from my_library import sub_package
将代码用作较大项目的子包时,这些导入不起作用,因为没有全局名称my_库
。例如,我必须使用相对或绝对导入
from large_project.my_library import sub_package
假设我编写了我的库,如第一个示例所示。作为较大项目的一部分运行时,如何覆盖导入行为以自动调整导入路径?您没有太多选择 如果您想在任何地方引用
my_library.py
,有两种方法(如我所知)可以做类似的工作
1:添加系统路径。与您通过
pip
安装的模块类似pip
模块安装在/Python/Scripts
中。您可以添加一个新路径,或者只需将my_library.py
放入其中一个路径。要添加,请在计算机(右键单击)->Properties->Environment Variable->选择路径并单击Edit
(尽管您可能不想使用此选项。)
2:更改
\uuuu init\uuuu.py
,但至少必须在我的库.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
但是您也可以将这个main_init作为库的启动程序,比如声明
\uuu all_uu
,等等。由于@MatrixTai建议将包的父目录添加到模块路径,我提出了这个动态解决方案。在my_library/\uuu init\uuuu.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/\uuu init_uuu.py
到my_library
,然后从那里到其父方向,在那里导入将找到库。导入行为是什么意思?例如,您的意思是从子目录导入时“执行不同的函数”吗?@MatrixTai目标是使第一个框中显示的导入工作,即使代码在另一个项目中用作子包,而不是作为外部依赖项。我可以想象使用导入钩子捕获所有导入,然后用\uuu module\uuu.my\u library
或类似内容替换我的库
,但我不熟悉Python的这些很少使用的特性。如果不添加任何行(如sys.path.append()),第一个库就无法工作
或importlib.import_module
),就像您将my_库
放入另一个项目中一样,python将其视为模块
,sub_包
是子模块
,您不能访问子模块而不声明它的父模块。@MatrixTai。我正在寻找一个片段,当我将它作为子包使用时,我可以将它添加到我的\u库/\uu init\uuuuuuuuuuuuuuuuuy.py中,而不必手动转换所有内部包含。如何使PyCharm
也理解它?