繁体   English   中英

虚拟环境中的 Conda ModuleNotFoundError

[英]Conda ModuleNotFoundError in a virtual environment

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

另请注意,我刚刚开始使用 Python。
我也觉得有必要解释我目前拥有的一切。 所以......抱歉这篇长帖子

主要问题

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

创建一个虚拟环境:

conda env create -f environment.yml

这将创建虚拟环境,我可以激活它并看到它安装了“烧瓶”。

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,但我在某些时候将它们更改为相同的(尽管出现相同的错误,也尝试了其他几个版本)。

主要问题:我在做什么/做错了什么?

我所拥有的和我尝试过的

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

pip install -r requirements.txt

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

我确实找到了一个有效的解决方案。 我用 apt 手动安装了烧瓶(以及之后的其他几个库):

sudo apt install python3-flask

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

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

exec gunicorn -b 0.0.0.0:5000 myapp:app

(似乎没问题,因为应用程序在 docker 容器中启动,甚至在本地启动时?全局?安装依赖项)在调用第二个脚本之前激活虚拟环境,通过在脚本中包含以下行:

source activate $env_name

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

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

  • Python 2.7.18 (Python)
  • Python 3.8.10 (Python3)
  • 来自 /usr/lib/python3/dist-packages/pip (python 3.8) 的 pip 20.0.2
    • pip3 给出相同的
  • conda 4.10.3(通过安装 miniconda)

我一直在使用蟒蛇代替miniconda因为似乎是在requirements.txt指向森蚺一些依赖也试过,但与瓶的错误是一样的。

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

尽管@razimbres 的建议实际上并不正确,但它让我思考了为什么在虚拟环境中找不到库的原因。 (是否有什么东西可以指导应用程序在 env 之外寻找库)

我已经通过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

附言。 似乎也不需要requirements.txt 也许它可以被删除(稍后)。 感觉它现在只是引起混乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM