2

首先,我已经浏览了很多关于这个问题的问答,但我找不到我的问题的解决方案。


我在 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()

使用这种方法,我可以从“生成器”目录运行 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
4

2 回答 2

2

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

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

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

于 2020-12-31T12:07:19.697 回答
1

所以,这个错误很明显,因为你没有声明一个名为summarygenerator. 由于utils与您的代码位于同一模块中summary_generator,因此您可以尝试像下面这样直接导入,因为Python 的模块搜索路径从当前目录开始

from utils import solver

解决您的问题的其他方法,通常utils是在不同的模块中打包您的应用程序并显式声明您的模块或查看设置PYTHONPATH以包含您想要的模块。

于 2020-12-28T10:35:07.567 回答