【问题标题】:Python virtual environments, package names and pipPython 虚拟环境、包名和 pip
【发布时间】:2021-12-10 05:11:45
【问题描述】:

我无法理解 Python 的包管理和虚拟环境。 到目前为止,我设法在 cmd 行并使用 PyCharm 创建了虚拟环境。

但在实际与他们合作时我仍然感到困惑:

当我在激活 (venv) 以查找包后在项目根文件夹中使用 pip search yaml 时,我收到以下消息:

ERROR: XMLRPC request failed [code: -32500]
RuntimeError: PyPI's XMLRPC API is currently disabled due to unmanageable load and will be 
deprecated in the near future. See https://status.python.org/ for more information.

而且我无法解释我在提到的网站上获得的信息。 现在的问题是如何使用 pip 搜索 Python 包? 如果 pip 不起作用,应该使用哪个工具? 我希望得到这样的信息,而不是错误或提到的网站上提供的信息。 pip 本身并没有在其文档中提及其他一些 API。

我使用的应用程序导入了一个名为“yaml”的包。当我尝试搜索此类包(使用 PyCharm)时,我收到如下消息:

ERROR: Could not find a version that satisfies the requirement yaml (from versions: none)
ERROR: No matching distribution found for yaml

但是为什么我可以在 PyCharm (Settings/Project/Python Interpreter) 中查找这样的包?

该应用使用的另一个 Python 库是 PIL。与 yaml 相同的问题。我可以使用 PyCharm 查找包,它显示一个包信息横幅,谈论 Python 图像库,版本 1.1.6,但是当我想安装它时,PyCharm 告诉我没有这样的库:

ERROR: Could not find a version that satisfies the requirement PIL (from versions: none)
ERROR: No matching distribution found for PIL

我查看了 PyPi.org,搜索 PIL 显示 1.029 个包。我应该拿哪一个?结果中有大量的包,它们的名称或描述中甚至都没有提到 PIL。这有用吗?

我现在使用 Python 3.8.10,就像我安装 3.10 和 3.9 之前一样,我想这些包可能还没有移植到较新的 python 版本。但即使在 3.8 上,它们似乎也不可用。

这让我想到另一个问题:

当我安装 Python 版本并从该 Python 版本创建虚拟环境时,pip 或我用来为该 venv 安装包的任何工具是否知道应该为哪个 Python 版本安装包?以便该包可以与 Python 版本一起使用并与之兼容?或者我是否需要自己处理这个问题,如果需要,我该如何确保这一点? 据我在 PyCharm 的包详细信息中看到的,没有任何信息是否与 venv 中使用的 Python 版本兼容。

最后,在考虑部署 Python 应用程序时如何使用虚拟环境。

在开发过程中,例如使用 PyCharm 我将我写的东西提交给 git。我也应该将 venv 提交给 git 吗?以及如何推出 Python 应用程序?只需将完整的项目文件夹复制到目标系统,或者使用 git 进行检查?包括venv文件夹?我应该首先在目标系统上安装完全相同版本的 Python 解释器吗? 然后我如何运行该应用程序以确保使用安装在 venv 中的所有需要​​的包?

【问题讨论】:

  • 是什么导致这些错误消息弹出?需要明确的是,正在使用哪些命令以及您在哪里确切地输入它们?
  • 添加了 pip 命令并提到它是在项目文件夹中激活的 venv 中执行的。
  • 刚刚发现我与“import cv2”有相同的包问题。我应该安装哪个软件包来满足“cv2”?
  • 看起来该命令由于高负载而被禁用。此信息可在错误消息中提到的页面以及快速搜索中找到:stackoverflow.com/questions/66375972/…theregister.com/2021/05/25/pypi_search_error。您仍然可以从 pypi.org 搜索软件包并使用常规安装命令。
  • @navneethc 感谢您的评论。但是为什么没有提到如何搜索呢?与提供有关后端负载的信息相比,这不是更有帮助吗?

标签: python-3.x pip pycharm python-venv


【解决方案1】:

既然你提到你使用 PyCharm:在 Pycharm 中你可以去Settings -> Project -> Interpreter 添加和删除包。在添加包的窗口中,您可以按名称过滤并选择特定版本。

如cmets中提到的,你也可以在pypi.org上搜索包。

另一种添加包的方法,可以说是推荐的,是创建一个requirements.txt 文件(名称是传统的,但可以更改),每行填充一个包,您可以为其指定特定版本(范围) 安装。拥有requirements.txt 文件后,激活虚拟环境后,您可以运行pip install -r requirements.txt 以安装其中的所有软件包。

您可以通过运行pip freeze > requirements.txt,从当前安装的包中创建requirements.txt

【讨论】:

  • 感谢您的回复。我只能在设置/项目上找到解释器的东西:...
  • 哦,对了,抱歉。
【解决方案2】:

首先,老实说,我对 pip 并不熟悉,所以我无法为您提供太多帮助。但是,当涉及到您关于 Python 虚拟环境和包的问题的另一部分时,我绝对可以为您提供帮助,因为它们是我在工作场所必须处理的问题。

我将把这篇文章分成不同标题下的几个部分,所以这里是:)

带有Mamba/Conda的Python虚拟环境

本质上,python 虚拟环境是一个目录,其中包含特定的 python 版本和您要用于特定 Python 项目的所有包。在我的工作场所,我使用 mambaconda 包管理器而不是 pip。

base 虚拟环境

当您安装 mambaconda 时,它将创建一个仅包含 Python 及其所有基本包的 base 虚拟环境。

在 Windows 上,如果您激活此 base 环境并键入 python,它将执行下的 Python 可执行文件

  • C:\Users\<user_name>\mambaforge\python.exe 如果您使用的是 mamba 包管理器
  • C:\Users\<user_name>\Anaconda3\python.exe 如果您使用的是 conda 包管理器

根据我的经验,我强烈推荐mamba 包管理器而不是conda,因为在查找包和解决我们要安装的包的依赖项时要快得多。 mamba 本质上是 conda 包管理器的改进版本,而且速度更快,因为它是用 C++ 编写的。 Please look at this github page for more information on mamba

添加新的虚拟环境

现在,假设您通过运行 conda create --name environment 创建一个名为 new_environment 的新虚拟环境。

这将创建一个新目录,Python 可执行文件及其所有包都将安装到该目录中。在 Windows 上,此目录将在此路径下创建:

  • C:\Users\<user_name>\mambaforge\envs\new_environment\ 如果您使用的是 mamba 包管理器
  • C:\Users\<user_name>\Anaconda3\envs\new_environment\ 如果您使用的是 conda 包管理器

搜索包

正如@navneethc 所说,pip 不幸禁用了他们的search 命令。据我了解,对于他们而言,启用此功能并处理其服务器上的所有请求似乎成本太高。

不过,好消息是,使用 mamba/conda,您仍然可以通过在命令行/终端上键入以下内容来搜索包:

  • conda search <package_name> --channel <channel_name> 如果你正在使用 conda
  • mamba repoquery search <package_name> --channel <channel_name> 如果您使用的是曼巴舞

然后该命令会将软件包的所有版本的列表输出到您的命令行/终端。

安装包

现在,从命令行,为了安装包到这个new_environment,我们只需要运行:

  • conda activate new_environment

  • conda install <package_name> --channel <channel_name>

    如果您使用的是mamba,请将conda 替换为上面的mamba

现在,当您将 Python 安装到这个 new_environment 时,python 可执行文件将位于

  • C:\Users\<user_name>\mambaforge\envs\new_environment\python.exe 如果你使用 mamba 安装 Python
  • C:\Users\<user_name>\Anaconda3\envs\new_environment\python.exe 如果你使用 conda 安装 Python

同样,当您激活new_environment 并运行python 时,它将使用位于此位置的python 可执行文件。

所有其他包(Python除外)都将安装在site-packages目录下:

C:\Users\<user_name>\Anaconda3\envs\new_environment\site-packages\


--注意--

您询问pip 是否会自动安装正确的软件包版本并为安装在激活的虚拟环境中的特定 python 版本进行构建。我不太确定 pip 但对于 conda/mamba,他们将 pin python 版本和 conda/mamba 将自动安装与您的 python 版本相对应的适当的包版本/构建


将环境导出到yaml 文件

为了让您将虚拟环境保存到 GitHub 等 Git 存储库托管服务,您需要通过运行以下命令将虚拟环境导出到 yaml 文件:

conda env export -f <name_of_yaml_file>.yaml

您必须添加此 yaml 文件,然后将其提交到您的 Git 存储库,然后将提交推送到 GitHub。

部署 Python 应用程序

我不知道您正在开发哪种 Python 应用程序。对于我的脚本,我只是从目标机器上的 BitBucket(我的工作场所使用 BitBucket)克隆了 git 存储库。每当在我的本地机器上对我的 python 脚本进行修改时,我都会提交并推送该更改,然后在目标机器上执行 git pull

在目标机器上重新创建虚拟环境

首先,您要在目标机器上安装conda/mamba(再次强烈推荐mamba)。

然后,借助您创建的yaml 文件在目标机器上重新创建虚拟环境。您可以通过转到您的项目目录轻松地做到这一点,然后运行conda env create -f <name_of_yaml_file>.yaml

然后您可以激活此环境并在此环境中运行您的 Python 应用程序

部署密钥/访问密钥

有人告诉我,正确的做法是使用 GitHub 上的 deploy key 或 BitBucket 上的 access key 来实际自动化 git pull 的过程。

有了这个特殊的ssh-key,显然我们可以使用某种脚本定义一个 git 工作流,只要我们的远程存储库中发生任何事情,它就会在目标机器上执行git pull。例如,我们可以定义要执行的脚本每当功能分支合并到我们的主分支时

我在这方面的知识绝对有限。如果有人对此更熟悉,请继续纠正我。

打包 Python 应用并将其托管在自定义频道上

我自己还在工作场所学习这方面的知识,但看起来我们可以构建我们的 Python 应用程序到一个包中,然后在我们自己的自定义频道中托管这个包。然后,你可以简单地做

conda install <our_app_package_name> --channel <our_custom_channel>

在目标机器上(激活我们的虚拟环境后)将我们的包安装到目标机器上。

this guide written by python.org on how to package our Python projects,我自己还在看这个

在 Pycharm 中使用 Conda 虚拟环境

终于可以use a conda/mamba virtual environment with Pycharm by following this guide了。

再一次,如果我说的不正确,请随时纠正我的说法,但只是与@Joysn 分享我在 Python 包管理方面的经验!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2012-07-24
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多