繁体   English   中英

Python中的绝对导入

[英]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')

现在这是我的问题:

  1. 如何使用绝对导入导入foo.py并在foo_bar.py中使用foo_func
  2. 如何导入foo.py并在bar.py foo_func使用绝对导入?
  3. 是否可以导入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),或者如果您确定它们将始终在一起,则可以进行相对导入

假设包含projectproject2的基本目录位于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 会按以下顺序查看这些文件夹:

  1. 最初执行的 Python 脚本的目录
  2. 标准库
  3. 已安装的外部库

您最初执行的是哪个文件? 如果你正在执行“project/__init__.py”,你应该能够像import package1.subpackage1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM