我们相信:世界是美好的,你是我也是。 来玩一下解压小游戏吧!

poetry其实就相当于pip+venv,所以这就引出了一个话题:poetry install命令,安装的虚拟环境中的第三方site-packages,到底在什么位置?这就是本文要讨论的问题。

苏南大叔:python项目管理poetry,poetry install的虚拟环境在哪里? - 虚拟环境位置
python项目管理poetry,poetry install的虚拟环境在哪里?(图3-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10python@3.12.9pip@25.0.1poetry@2.1.2

配置文件

首先,poetry是有全局配置文件和项目配置文件的,两者都叫做poetry.toml。一般在项目根目录下面里,躺着的poetry.toml文件,才是本文的主角。

从代码分发角度来说,只有项目根目录下的poetry.toml才有机会跟着源码走。而全局的配置文件poetry.toml是部署在各个开发者的开发机上面的。那么,如果源码的所有者,希望必须有某个设置。比如:venv安装在当前目录下面。那么,就是通过修改项目根目录下面的poetry.toml来实现的这个设定目的。

配置 virtualenvs

所以,具体配置哪个poetry.toml文件,就根据实际情况定了。因为两者存在着一个配置覆盖的关系。poetry.toml一个关键部分是 [virtualenvs],它控制了在执行 poetry install 时虚拟环境的管理方式。

通过下面的命令,可以查看以virtualenvs开头的配置项目。

poetry config --list

苏南大叔:python项目管理poetry,poetry install的虚拟环境在哪里? - 默认配置查看
python项目管理poetry,poetry install的虚拟环境在哪里?(图3-2)

配置项目解释

相关配置项目就是:

virtualenvs.create = true
virtualenvs.in-project = null
virtualenvs.options.always-copy = false
virtualenvs.options.no-pip = false
virtualenvs.options.system-site-packages = false
virtualenvs.path = "{cache-dir}\\virtualenvs"  # C:\Users\sunan\AppData\Local\pypoetry\Cache\virtualenvs
virtualenvs.prompt = "{project_name}-py{python_version}"
virtualenvs.use-poetry-python = false

配置 [virtualenvs] 的好处:

  • 隔离性:通过隔离项目依赖,避免依赖冲突。
  • 便携性in-project 选项使项目更容易与他人共享,因为虚拟环境是自包含的。
  • 可控性:像 prefer-active-python 这样的选项让你可以精确控制使用的 Python 解释器。

1. prefer-active-python

  • 描述:当设置为 true 时,Poetry 会使用当前激活的 Python 解释器来创建虚拟环境。
  • 影响

    • 确保与当前使用的 Python 版本兼容。
    • 在安装了多个 Python 版本的环境中非常有用,可以避免版本选择的歧义。

2. virtualenvs.create = true

  • 描述:决定是否为项目创建虚拟环境。
  • 默认值true
  • 影响

    • 如果设置为 true,Poetry 会为项目创建一个虚拟环境(如果不存在)。
    • 如果设置为 false,Poetry 会直接在当前 Python 环境中安装依赖。

3. virtualenvs.in-project = null

  • 描述:决定虚拟环境是否创建在项目目录中。
  • 默认值null(表示使用全局缓存目录)。
  • 影响

    • 如果设置为 true,虚拟环境会创建在项目目录下的 .venv 文件夹中。
    • 如果设置为 falsenull,虚拟环境会创建在全局缓存目录中(如 {cache-dir}\virtualenvs)。

4. virtualenvs.options.always-copy = false

  • 描述:决定虚拟环境中是否使用文件复制而非符号链接。
  • 默认值false
  • 影响

    • 如果设置为 true,Poetry 会复制文件到虚拟环境中,而不是创建符号链接。
    • 在某些文件系统不支持符号链接的情况下(如 Windows 的某些环境),可以启用此选项。

5. virtualenvs.options.no-pip = false

  • 描述:决定虚拟环境中是否安装 pip
  • 默认值false
  • 影响

    • 如果设置为 true,虚拟环境中不会安装 pip,这可能导致无法安装依赖。
    • 通常保持为 false 以确保依赖管理正常工作。

6. virtualenvs.options.system-site-packages = false

  • 描述:决定虚拟环境是否可以访问系统级的 Python 包。
  • 默认值false
  • 影响

    • 如果设置为 true,虚拟环境可以访问全局安装的 Python 包。
    • 如果设置为 false,虚拟环境会完全隔离,不访问全局包。

7. virtualenvs.path = "{cache-dir}\\virtualenvs"

  • 描述:指定虚拟环境的存储路径。
  • 默认值"{cache-dir}\\virtualenvs"(如 C:\Users\sunan\AppData\Local\pypoetry\Cache\virtualenvs)。
  • 影响

    • 虚拟环境会被创建在指定路径中。
    • 可以自定义路径以满足特定需求。

8. virtualenvs.prompt = "{project_name}-py{python_version}"

  • 描述:自定义虚拟环境的提示符格式。
  • 默认值"{project_name}-py{python_version}"
  • 影响

    • 提示符会显示项目名称和 Python 版本,方便区分不同的虚拟环境。
    • 可以根据需要修改格式。

9. virtualenvs.use-poetry-python = false

  • 描述:决定是否强制使用 Poetry 自身的 Python 解释器。
  • 默认值false
  • 影响

    • 如果设置为 true,Poetry 会使用自身的 Python 解释器创建虚拟环境。
    • 如果设置为 false,Poetry 会使用当前激活的 Python 解释器。

控制虚拟环境的位置

以下是一个 poetry.toml 配置示例:

[virtualenvs]
in-project = true
create = true
prefer-active-python = true

苏南大叔:python项目管理poetry,poetry install的虚拟环境在哪里? - 项目配置安装
python项目管理poetry,poetry install的虚拟环境在哪里?(图3-3)

当你使用此配置运行 poetry install 时:

  1. 一个 .venv 文件夹会在项目目录中创建。
  2. 依赖会被安装到该虚拟环境中,从而与全局 Python 环境隔离。
  3. 当前激活的 Python 解释器会被使用,以确保兼容性。

不使用venv

不使用venv的话,这个poetry基本上和pip也么有啥大区别了。所以,默认应该为true

virtualenvs.create = false

放在全局

在全局的某个位置下,存在着一个目录。为开发者的机器上的项目,存放着不同目录的.env目录。也就是说,所有的虚拟环境统一放在一起。

virtualenvs.in-project = null

或者

virtualenvs.in-project = false

放项目根目录下【推荐】

这个就像node项目的npm_modules目录一样,虚拟环境就放在项目的根目录下面。不过,记得要git ignore一下,否则这些虚拟环境目录,就可能会被提交到云端,影响其他人了。

virtualenvs.in-project = true

结语

poetry.toml 中的 [virtualenvs] 部分提供了强大的选项,用于自定义虚拟环境的管理方式。通过理解和配置这些选项,你可以确保 poetry install 的行为符合项目需求,从而提高开发效率和项目的可维护性。

更多苏南大叔的python相关经验文字,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python