导入包时出现FileNotFound错误

问题描述 投票:0回答:1

我正在使用 python 3.11.6 创建一个语音助手,在我的项目中我有一个“Synthesizer”包,其中有两个文件:model.pt 和 main.py。在 main.py (self.local_file="model.pt") 中:

   def download_model(self, url="https://models.silero.ai/models/tts/ru/v4_ru.pt"):
        """
        Function for downloading voice model
        :param url: address for downloading voice model
        """
        # downloading model from source
        if not os.path.isfile(self.local_file):
            torch.hub.download_url_to_file(url, self.local_file)

我还有一个名为 Core 的包,我在其中导入 sythesizer,使用 from Synthesizer.main import Synthesizer (Synthesizer 是一个类)。但是当我尝试启动 Core 时,它找不到“model.pt”文件。

如果我将 model.pt 放置在 Core 目录中,那么它就会起作用。但我想把所有东西都放在相应的包中。我如何修改我的项目才能使其正常工作?我有很多其他外部文件,例如语音识别模型等。但我想将它们全部保存在所需的包中。

python linux file python-packaging pythonpath
1个回答
0
投票

您没有告诉我

self.local_file
实际上是什么,所以我假设它是指向包内某处的路径。

您也没有向我展示这个

Core
模块,据我了解,该模块负责读取
.pt
文件。您可能需要更改 Core 中的代码才能真正找到该文件。

一般来说,将数据文件下载到包的目录层次结构中不是一个好主意。例如,如果有人将您的软件包安装为 zip 存档,您的代码将无法工作。此外,如果诸如

pip
之类的工具看到您的包中没有放置的文件,它们可能会感到困惑。最后,如果软件包的用户希望将文件存储在不同的文件系统上(例如,如果安装软件包的文件系统太小或只读)怎么办?

出于这些原因,最好将外部下载的数据保存在单独的位置。您应该让用户选择下载的数据的去向。如果用户没有指定它,则默认值应该是目标平台/操作系统的约定。例如,在 Linux 上,它可能类似于

~/.mypackage
或(更好)
$XDG_DATA_HOME/mypackage

一个很好的例子是

easyocr
,它是一个流行的Python包,也可以下载外部数据。你可以看一下它是如何确定保存数据的路径这里以及实际保存数据的代码这里

© www.soinside.com 2019 - 2024. All rights reserved.