如何解决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 举报,一经查实,本站将立刻删除。