虚拟环境中的 Conda ModuleNotFoundError

Conda ModuleNotFoundError in a virtual environment

显然有很多类似的问题,但我不得不再次问同样的问题,因为我无法从其他问题(也没有通过合理搜索的任何其他地方)找到解决方案(有效)。

另请注意,我刚刚开始 Python。
我也觉得有必要解释一下我目前拥有的一切。所以...很抱歉 post

主要问题

我有一个遗留的 Python 项目,我需要在本地开始工作(在 Ubuntu 20.04 上)。此项目有 environment.yml 和 requirements.txt 个文件。

创建了一个虚拟环境:

conda env create -f environment.yml

这将创建虚拟环境,我可以激活它并看到它已安装 'flask'。

conda list |grep flask
>> flask                     1.1.2                    pypi_0    pypi

pip list |grep Flask
>> flask                     1.1.2                    pypi_0    pypi

但是当我尝试 运行 应用程序时,出现错误:

ModuleNotFoundError: No module named 'flask'

一开始 'flask' 的版本实际上是 conda 的 1.1.2 和 pip 的 1.1.1,但我在某些时候将它们更改为相同的(不过同样的错误,尝试了其他几个版本也是如此)。

主要问题:我doing/having哪里错了?

我所拥有的和我尝试过的

我尝试在创建环境后通过 requirements.txt 进行 pip 安装。我在虚拟环境内外都这样做了。

pip install -r requirements.txt

但这会导致很多错误,因为找不到库,所以我认为它可能已经过时(或者只是不适用于我当前的环境)。我知道它应该代表为应用程序工作的环境安装的库。 (我的猜测是,这最初是从应用程序 运行 的容器中获取的?)

我确实找到了一个有效的解决方案。我用 apt:

手动安装了烧瓶(以及之后的其他几个库)
sudo apt install python3-flask

然而,这显然不是正确的解决方案,因为库应该只存在于虚拟环境中 (afaik)。此外,这似乎与 pip 一起工作过一次(也许与 anaconda 一起......不知道了。无法让它再次发生。)。 我想我可以手动将这些要求写入一个新的“requirments_local.txt”,如果我可以再次使用 pip 安装,我可以使用它,但我认为这是错误的(为什么要有 environment.yml 和一个要求-文件?)。 (environment.yml 也有 pip 库要安装)

我不认为这很重要,但写下来以防万一。
该应用程序通过两个 bash 脚本启动,其中第一个脚本设置一些 运行 时间设置,然后调用另一个脚本(entrypoint.sh 也被容器使用)最终有这个启动实际应用程序的行:

exec gunicorn -b 0.0.0.0:5000 myapp:app

(似乎没问题,因为应用程序在 docker 容器中启动,甚至在“全局”安装依赖项时在本地启动) 在调用第二个脚本之前激活虚拟环境,方法是在脚本中加入这一行:

source activate $env_name

我正在使用 source,因为我注意到 'conda activate $env_name' 不起作用。我通过在两个脚本的不同阶段执行 'conda env list > conda.txt' 检查是否使用了正确的环境。

我使用 Ubuntu 20.04 并安装了这些:

我也尝试过使用 anaconda 而不是 miniconda 因为 [=104 中似乎存在一些依赖关系=]指向anaconda,但是烧瓶的错误是一样的。

其他问题:我可以从版本控制中省略 requirements.txt 还是可以以某种方式与 environment.yml?在两个文件中列出库版本感觉不对。已经创建虚拟环境时,这些要求的目的是什么?

虽然@razimbres 的建议实际上并不正确,但它给了我一个想法,让我思考为什么在虚拟环境中找不到库的原因。 (可能有什么东西可以指示应用程序在环境之外寻找库)

我通过 apt 安装了绿色独角兽,因为缺少它是最初启动应用程序时的第一个错误。

exec gunicorn -b 0.0.0.0:5000 myapp:app

./entrypoint.sh: line 62: exec: gunicorn: not found

因为它在 environment.yml 中丢失并且不知道更好,我通过 apt 安装它(因为它有没有...虽然现在有人可以解释为什么?它显然只是把事情搞砸了。)。

我向 environment.yml 添加了以下 (conda) 依赖项:
- 枪炮==20.1.0

然后再次创建环境:

conda env remove --name $env_name
conda env create -f environment.yml

现在可以了。 (甚至从脚本开始)
我认为教训是:不要使用 apt 安装任何 python 资源。

还有。如果有的话,请卸载通过 apt 安装的所有 python 资源。就像我的情况一样:

sudo apt remove gunicorn

Ps。此外,似乎不需要 requirements.txt 。也许它可以被删除(稍后)。感觉目前只是造成混乱。