微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python包的相对导入问题

如何解决python包的相对导入问题

首先,我查看了很多关于这个问题的问答,但我找不到解决我的问题的方法


我使用的是 Python 3.7.9,我的文件结构如下

generator/
    __init__.py
    main.py
    summarygenerator/
        __init__.py
        utils.py
        summary_generator.py

summary_generator.py 看起来像

from summarygenerator.utils import solver

def sum_gen():
   pass
if __name__ == '__main__':
   sum_gen()

通过这种方法,我可以从“generator”目录运行 main.py:

python main.py

和summary_generator.py 与

python -m summarygenerator.summary_generator

但是,当我想从 generator/summarygenerator 目录运行 summary_generator.py 时,我会遇到:

ModuleNotFoundError: No module named summarygenerator

如下所示的相对导入也不能解决问题。

from .utils import solver

解决方法

Python 模块旨在从其根目录的父目录运行 包裹。所以运行脚本的正确方法是(从生成器目录开始):

$ cd ..
$ python -m generator.main
$ python -m generator.summarygenerator.summary_generator

导入旨在开箱即用,您甚至可以使用相对导入。现在,您似乎希望能够从两个不同的位置开箱即用(使用相同的代码)运行具有相同代码的 python 脚本。这不受支持,而且确实没有任何意义。在导入的情况下,这意味着 python 应该能够以两种不同的方式记录模块的名称,并且所有内容(所有其他模块名称)都应该使用这两种名称。或者采用在文件中定义相对路径的(更简单的)情况(如 open('some_file')) - 如果文件以两种方式运行,这注定会失败。在这两种情况下,问题都是当前工作目录的变化——运行脚本的目录被设置为相对于计算路径(包括模块路径)的当前工作目录。您可以通过弄乱当前的工作目录并创建更微妙的错误来使“从任何文件夹运行我”工作 - 或者(这就是我认为的答案)停止尝试能够从不同的文件夹运行相同的脚本,编写导入,以便它们使用上面的命令,这是运行 python 脚本的推荐方式(因此所有有关导入的文档都假定以这种方式运行)

,

因此,该错误非常明显,因为您尚未声明名为 summarygenerator 的模块。由于 utils 与您的 summary_generator 代码位于同一模块中,因此您可以尝试直接执行如下所示的导入,因为 Python's module search path starts with the current directory

from utils import solver

解决您的问题的其他方法(通常当 utils 位于不同的模块中时)是打包您的应用程序并显式声明您的模块,或者查看设置 PYTHONPATH 以包含您所需的模块。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。