python项目管理poetry,poetry install的虚拟环境在哪里?
发布于 作者:苏南大叔 来源:程序如此灵动~
poetry其实就相当于pip+venv,所以这就引出了一个话题:poetry install命令,安装的虚拟环境中的第三方site-packages,到底在什么位置?这就是本文要讨论的问题。

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10,python@3.12.9,pip@25.0.1,poetry@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
配置项目解释
相关配置项目就是:
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文件夹中。 - 如果设置为
false或null,虚拟环境会创建在全局缓存目录中(如{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
当你使用此配置运行 poetry install 时:
- 一个
.venv文件夹会在项目目录中创建。 - 依赖会被安装到该虚拟环境中,从而与全局 Python 环境隔离。
- 当前激活的 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相关经验文字,请点击: