【问题标题】:No module named contextlib? in a virtualenv?没有名为 contextlib 的模块?在虚拟环境中?
【发布时间】:2019-03-14 00:36:34
【问题描述】:

我有一个通过 Dropbox 在多台机器上使用的 virtualenv。我们的保管箱都在同步到同一个位置,(或者至少是符号链接,所以它看起来如此)所以,重定位问题应该没有实际意义。

在我的机器上,一切正常。我可以创建一个 virtualenv,它工作正常。但是,别人用的时候,python给No module named contextlib

当我在其他人的计算机上创建 virtualenv 时,它似乎可以在我的计算机上运行(我没有彻底测试过)

所有计算机都是 Mac。我的运行 High Sierra,其他人运行 Mojave,以防万一。

我该如何解决这个问题?或者至少,是什么原因造成的?

我见过Python: No module named contextlib?,但这似乎与嵌入式硬件无关。

注意:我知道 python 认为我不应该这样做。但是,我有一个不是程序员的用户群。他们无法管理自己的 venvs。他们无法处理复杂的码头工人。他们想输入python foo.py 并让它工作。在过去,我已经让它与 venvs 一起使用。

如果python不能轻松处理这种简单的情况,那么我认为这是一个问题。

哦,我知道库对于不同的操作系统是不同的,我通过为 Windows 用户设置不同的 venv 来更简单地处理这个问题。效果很好,没有问题。

【问题讨论】:

  • 我想说你描述的设置真的很奇怪,我不建议跨多个项目共享库,更不用说跨多台计算机,这就像免费问问题一样。可能是操作系统出了问题,我建议您使用需求文件并习惯pip install 在这里您还可以添加关于可能出错的内容stackoverflow.com/a/35672533/4229159
  • 我没有在多个项目中使用它。一个项目被多人使用。我不希望他们维护自己的 venv,因为那样我就必须不断地修复 12 个不同的 venv。对我来说,只拥有一个我自己维护并且每个人都使用的更好。
  • 看来这主要是操作系统版本问题。当我在 Mojave 电脑上创建 venv 时,我可以在其他机器上成功运行 python。更多问题将在一个新问题中提出。
  • 我遇到了同样的问题。它给出了错误,因为为 python3.5 配置了虚拟环境,然后我更新了使用 python3.6 的代码。然后我首先安装了 python3.6 并设置了虚拟环境来使用它。这解决了我的问题。

标签: python macos virtualenv


【解决方案1】:

一般而言,跨计算机和跨不同操作系统共享依赖项文件夹会产生问题。这现在可能适用于您的设置(所有相同的操作系统相同版本),但是一旦您将与拥有windowslinux 甚至其他版本的相同操作系统提供商的人合作,您将有问题。

与其寻找解决方法来解决如何修复 contextlib 的缺失依赖项,不如转到问题的根源并通过共享依赖项文件夹来解决您生成的问题。如果人们在他们的环境中遇到问题,可能会创建一个脚本来运行项目,使用 docker 机器进行配置,或者使用一个虚拟机来执行始终与基础相同的版本来运行其中的所有内容。

这是一篇很好的关于如何organise dependencies in a project 的文章(来自 python 文档)

另外,我建议您将项目移动到 docker 容器或类似容器中,这样您就可以在同一个环境下工作,从长远来看,这将更容易开发和部署代码到生产服务器。

run python on docker you can read this article,但还有更多,从长远来看可以减轻您的工作

如果您的用户无法运行pip install -r requirements.txt,我认为他们也无法运行virtualenv --relocatable ENV,对吧?

我不得不说,您必须为您的用户搜索新工具。也许你的应用程序的脚本或某种docker image 使用简单的run 命令可能会更容易。

【讨论】:

  • 第一个是关于pip的,我想我明白了。有没有我误解的特定部分?第二个...... Docker 的功能比我需要的要强大得多,而且比我的用户可以处理的要多得多。
  • 基本上这并不能回答我的问题。我知道人们认为 tihs 是一个坏主意,但我已经研究过选项,这是我这样做的唯一方法。
【解决方案2】:

来自 virtualenv documentation

通常环境与特定路径相关联。 这意味着您无法移动环境或将其复制到另一台计算机。您可以使用以下命令修复环境以使其可重定位:

$ virtualenv --relocatable ENV

同一页有重要说明:

注意:您必须在将任何软件包安装到环境中后运行它。如果您使环境可重定位,然后安装新软件包,则必须再次运行该命令。

此外,这不会使您的包跨平台。您可以移动目录,但它只能在其他类似的计算机上使用。

它仍然是一个实验性功能。不用说,这不是推荐的生产设置。

【讨论】:

  • 我不需要它是多平台的。它没有被复制或移动。所有实例都位于相同的逻辑位置,因此对于所有用户来说它应该看起来相同。我不明白为什么这是个问题。
  • 这不会使它跨平台,它使它可以在不同的计算机上重新定位和使用...检查我给你的链接。
  • 没关系。我不在乎多平台。
  • Virtualenvs 使用绝对路径,在每台计算机上可能不一样。上面的命令将路径更改为相对路径,允许在每台机器上找到包。
  • 我明白这一切。路径是相同的。
猜你喜欢
  • 1970-01-01
  • 2019-03-03
  • 2017-09-11
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
相关资源
最近更新 更多