[英]Absolute Import in Python
我很难理解 Python 中的绝对导入。 我将不胜感激任何帮助!
我正在使用 Python 3.10.5(目前是最新版本)作为参考。
现在假设这是我的目录:
project
├── __init__.py
└── package1
├── __init__.py
├── subpackage1
│ ├── __init__.py
│ └── foo.py
└── subpackage2
├── __init__.py
├── bar.py
└── subpackage2A
├── __init__.py
└── foo_bar.py
project2
├── __init__.py
└── ...
├── __init__.py
└── tom.py
另外,假设foo.py
包含这个函数:
def foo_func():
print('in foo.py')
现在这是我的问题:
foo.py
并在foo_bar.py
中使用foo_func
?foo.py
并在bar.py
foo_func
使用绝对导入?foo_bar.py
并在tom.py
foo_func
如果您能详细说明您的答案,我将不胜感激。 谢谢!
你可以在你的包/项目中使用相对导入
我认为对于您的样本,它将类似于
#foo_bar.py
from ...subpackage1.foo import foo_func
#bar.py
from ..subpackage1.foo import foo_func
对于 tom.py,因为在其他项目中,该项目需要通过常规导入机制访问(例如将它们添加到您的 PYTHONPATH),或者如果您确定它们将始终在一起,则可以进行相对导入
假设包含project
和project2
的基本目录位于sys.path
中(例如,因为您使用setup.py
将所述项目安装到具有该目录结构的用户或系统site-packages
中,或者您使用PYTHONPATH
做了一些hacky,或者脚本本身修改了sys.path
以骇人听闻的方式),所有三个问题的答案都是相同的:
想要调用foo_func
的源文件将包含行import project.package1.subpackage1.foo
,并且可以调用project.package1.subpackage1.foo.foo_func()
,或者它可以from project.package1.subpackage1.foo import foo_func
并调用foo_func
unqualified(它也可以使用from project.package1.subpackage1 import foo
并执行foo.foo_func()
或as ANYNAME
来简化非from
import 或别名 import)。
答案是一样的,因为这就是绝对进口的重点。 他们是绝对的。 只要包含project
的目录位于包含project
目录的任何其他目录之前的sys.path
中(或者如果该其他project
目录省略__init__.py
文件以保持隐式命名空间包,或者包含__init__.py
文件和黑客显式命名空间包) project.package1.subpackage1.foo
是任何希望导入它的 Python 模块可用的绝对路径。
导入某些东西时,Python 会按以下顺序查看这些文件夹:
您最初执行的是哪个文件? 如果你正在执行“project/__init__.py”,你应该能够像import package1.subpackage1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.