我在理解 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(设置/项目/Python 解释器)中查找这样的包呢?
该应用程序使用的另一个Python库是PIL。与 yaml 相同的问题。我可以使用 PyCharm 查找包,它显示了一个包信息横幅,谈论 Python Image Library 版本 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 中的所有必需软件包?
既然你提到你使用了PyCharm:在Pycharm中,你可以去Settings -> Project -> Interpreter
添加和删除包。在添加包的窗口中,您可以按名称过滤并选择特定版本。
如评论中所述,您还可以在 pypi.org 上搜索软件包。
添加软件包的另一种方法(可以说是推荐的)是创建一个requirements.txt
文件(名称是常规的,但可以更改),每行填充一个软件包,您可以为其指定要安装的特定版本(范围)。获得requirements.txt
文件后,激活虚拟环境后,您可以运行pip install -r requirements.txt
来安装其中的所有软件包。
您可以通过运行pip freeze > requirements.txt
从当前安装的软件包创建requirements.txt
。
首先,老实说,我对pip并不熟悉,所以我不能帮你太多。但是,当涉及到您关于 Python 虚拟环境和包的问题的另一部分时,我绝对可以帮助您,因为它们是我在工作场所必须处理的问题。
我将把这篇文章分解成不同标题下的几个部分,所以这里:)
具有Mamba
/Conda
的Python虚拟环境
从本质上讲,python虚拟环境是一个目录,其中包含特定的python版本以及要用于特定Python项目的所有包。在我的工作场所,我使用的是mamba
和conda
包管理器而不是 pip。
base
虚拟环境
当你安装mamba
或conda
时,它将创建一个base
虚拟环境,只包含Python及其所有基本包。
在 Windows 上,如果您激活此base
环境并键入python
,它将在
C:Users<user_name>mambaforgepython.exe
是否正在使用包管理器mamba
C:Users<user_name>Anaconda3python.exe
是否正在使用包管理器conda
根据我的经验,我强烈建议mamba
包管理器而不是conda
因为在查找包和解析我们要安装的包的依赖项时要快得多。mamba
本质上是conda
包管理器的改进版本,而且速度要快得多,因为它是用C++编写的。请查看此 github 页面以获取有关曼巴的更多信息
添加新的虚拟环境
现在,假设您通过运行conda create --name environment
来创建一个名为new_environment
的新虚拟环境。
这将创建一个新目录,将在其中安装 Python 可执行文件及其所有包。在 Windows 上,将在以下路径创建此目录:
C:Users<user_name>mambaforgeenvsnew_environment
是否正在使用包管理器mamba
C:Users<user_name>Anaconda3envsnew_environment
是否正在使用包管理器conda
搜索包
正如@navneethc所说,不幸的是,pip 禁用了他们的search
命令。据我了解,看起来启用此功能并处理服务器上的所有请求的成本太高了。
但是,好消息是,使用mamba
/conda
,您仍然可以通过在命令行/终端上键入以下内容来搜索软件包:
conda search <package_name> --channel <channel_name>
如果您使用的是 condamamba 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>mambaforgeenvsnew_environmentpython.exe
如果你使用mamba来安装PythonC:Users<user_name>Anaconda3envsnew_environmentpython.exe
如果您使用 conda 安装 Python
同样,当您激活new_environment
并运行python
时,它将使用位于此位置的python可执行文件。
所有其他软件包(Python除外)都将安装在site-packages
目录下:
C:Users<user_name>Anaconda3envsnew_environmentsite-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 键,显然我们可以使用某种脚本定义一个 git 工作流,每当我们的远程仓库中发生某些事情时,该脚本将在目标计算机上执行git pull
。例如,我们可以定义每当功能分支合并到我们的主分支时要执行的脚本
我在这方面的知识绝对是有限的。如果有人对此更熟悉,请继续纠正我。
打包 Python 应用并将其托管在自定义通道上
我自己仍在工作场所学习这一点,但看起来我们可以将 Python 应用程序构建到一个包中,然后在我们自己的自定义通道中托管此包。然后,您可以简单地做
conda install <our_app_package_name> --channel <our_custom_channel>
在目标计算机上(激活虚拟环境后)将我们的软件包安装到目标计算机。
python.org 写了一本关于如何打包我们的Python项目的指南,我自己还在读这个
将Conda虚拟环境与Pycharm结合使用
最后,您可以按照本指南将conda/mamba虚拟环境与Pycharm一起使用。
同样,如果它以某种方式不正确,请随时纠正我所说的,但只是与您分享我在 Python 包管理方面的经验@Joysn!