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
相关经验文字,请点击:


