Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何在Python中为导入设置别名?_Python 3.x_Python 2.7_Python Import - Fatal编程技术网

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
也理解它?