分享基于 nix 的虚拟环境搭建

49 views
Skip to first unread message

yi huang

unread,
Mar 23, 2025, 9:11:28 PMMar 23
to python-cn
分享一下我最近常用的基于 nix 的虚拟环境搭建方法。

## 先决条件

安装 nix 和 direnv.

## 配置文件

在项目根目录创建文件 .envrc:

```
use nix -p python312Full uv
export VIRTUAL_ENV=."venv"
layout python
export TMPDIR=/tmp
```

他会安装指定版本的 python 和 uv,并且自动在 `.venv` 创建虚拟环境。

运行 `direnv allow` 激活,以后进入目录都会自动激活虚拟环境。

## 安装依赖

最后运行 `uv pip install -e .`,通常就会自动把依赖库都装上了。

## 系统依赖

使用  `nix` 最大的好处就是管理系统级依赖库,比如我最近玩的 manim 需要安装 cairo,那只要把它加到 .envrc 里面的第一行即可:

```diff
- use nix -p python312Full uv
+ use nix -p python312Full uv pkg-config cairo
```

## 结论

* 灵活的 python 版本管理,每个项目都可以配置独立的 python 版本。
* 每个项目独立配置系统级别的依赖。
* python 环境的部分交给 uv 或者 poetry 等现代的管理工具。
* 把 python 的 virtualenv 升级到了系统级别的虚拟环境。

Zoom.Quiet

unread,
Mar 23, 2025, 9:16:02 PMMar 23
to CPyUG~华蠎用户组
yi huang <yi.cod...@gmail.com> 于2025年3月24日周一 09:11写道:
看起来不错哪,
只是, 这种管理方式, 要配置对应 crontab/supervisor 时, 怎么切换到指定运行时?
另外, 在内网时, 要配置到哪些仓库镜像能确保自动安装时对应模块存在?
进一步的, 是否支持一键盘迁移到其它同版本系统主机中? 不用反复安装?
如果使用 docker 进行容器化, 也适用嘛?


--
----------------
life is pathetic, go Pythonic. 人生苦短, Python当歌 ;-)
俺: http://zoomquiet.io
大妈的多重宇宙 - https://www.youtube.com/@Chaos42DAMA
许: http://creativecommons.org/licenses/by-sa/2.5/cn/
怒: 冗余不做,日子甭过; 备份不做,十恶不赦; 格式兼容,无惧老化.
KM keep growing environment culture which promoting organization learning ;-)

Gavin Kou

unread,
Mar 23, 2025, 9:28:14 PMMar 23
to python-cn
大家竟然都在……
nix听起来也是一个virtualenv 上面的套娃,只是套到level更高了,蛮有趣的。
坦白说:因为应用版本依赖的原因,
发布一个应用,连带着得把从语言平台到依赖库一股脑的全家桶都带上。有点版本洁癖的我来说,真的有点不忍直视。
py如此,ruby如此,php现在也如此了。java早就如此。

但回到现实,还是得不停的在不同版本的py之间进行切换。

在ZQ的签名后面加一句:冗余不做,日子甭过; 备份不做,十恶不赦; 格式兼容,无惧老化;版本兼容,扔掉虚拟

 


------------------ Original ------------------
From: "python-cn" <zoom....@gmail.com>;
Date: Mon, Mar 24, 2025 09:15 AM
To: "CPyUG~华蠎用户组"<pyth...@googlegroups.com>;
Subject: Re: [CPyUG] 分享基于 nix 的虚拟环境搭建
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
---
您收到此邮件是因为您订阅了 Google 群组的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
如需查看此讨论,请访问 https://groups.google.com/d/msgid/python-cn/CAAFijReVeerky7mSHH1fOLvo%3DKpQ3h5ksc1AoAZuk6zzAgujLg%40mail.gmail.com

yi huang

unread,
Mar 23, 2025, 9:45:59 PMMar 23
to pyth...@googlegroups.com
这种场景就是 nix-shell,比如我们集成测试的环境,你把依赖写到 nix 表达式里面,提交到仓库,在 CI 中自动运行,mac 和 linux 完美兼容。
 
另外, 在内网时, 要配置到哪些仓库镜像能确保自动安装时对应模块存在?

nix 本身的 cache.nix.org 需要镜像
然后安装 python 库可能也需要 pypi 的镜像吧。
 
进一步的, 是否支持一键盘迁移到其它同版本系统主机中? 不用反复安装?

Mac和 Linux 都能用,甚至不依赖系统主机的版本,你想要指定特定的libc的版本都可以。
 
如果使用 docker 进行容器化, 也适用嘛?

没问题,直接从 nix 表达式build docker 镜像
 


--
----------------
life is pathetic, go Pythonic. 人生苦短, Python当歌 ;-)
俺: http://zoomquiet.io
大妈的多重宇宙 - https://www.youtube.com/@Chaos42DAMA
许: http://creativecommons.org/licenses/by-sa/2.5/cn/
怒: 冗余不做,日子甭过; 备份不做,十恶不赦; 格式兼容,无惧老化.
KM keep growing environment culture which promoting organization learning ;-)

yi huang

unread,
Mar 23, 2025, 9:48:10 PMMar 23
to pyth...@googlegroups.com
更改:cache.nixos.org 和 镜像

Zoom.Quiet

unread,
Mar 24, 2025, 12:09:00 AMMar 24
to CPyUG~华蠎用户组
yi huang <yi.cod...@gmail.com> 于2025年3月24日周一 09:45写道:
哗..那就解决真正的运维核心需求了..
uv 果断只是专项工具,
整体环境的管理还是得有个专用工具来追踪,
以往俺只知道 nix 是用来组织多版本测试的,
可以高速构建不同宿主系统版本和不同 Python 运行时版本环境,
以便进行集成和安装测试,
反过来想, 有这种能力, 当然也可以用在 CI/CD 自动化上了..

>>
>> 如果使用 docker 进行容器化, 也适用嘛?
>
>
> 没问题,直接从 nix 表达式build docker 镜像。
>
>>
>>
>>
..

yi huang

unread,
Mar 24, 2025, 1:18:35 AMMar 24
to pyth...@googlegroups.com
甚至还有 NixOS 和devops。
 

>>
>> 如果使用 docker 进行容器化, 也适用嘛?
>
>
> 没问题,直接从 nix 表达式build docker 镜像。
>
>>
>>
>>
..

--
----------------
life is pathetic, go Pythonic. 人生苦短, Python当歌 ;-)
俺: http://zoomquiet.io
大妈的多重宇宙 - https://www.youtube.com/@Chaos42DAMA
许: http://creativecommons.org/licenses/by-sa/2.5/cn/
怒: 冗余不做,日子甭过; 备份不做,十恶不赦; 格式兼容,无惧老化.
KM keep growing environment culture which promoting organization learning ;-)

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
---
您收到此邮件是因为您订阅了 Google 群组的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com

m

unread,
Mar 27, 2025, 2:53:12 PMMar 27
to pyth...@googlegroups.com
这么做还是有系统强依赖,比如需要系统的cairo。
uv现在已经可以直接管理py版本+库了,没必要还依赖系统库。
这样只需要1一个pyproject+lock就可以精确描述依赖,

感觉py的依赖最好还是用uv来管理,其他系统级的依赖,比如mysql或者第三方工具再上nix/docker.

您收到此邮件是因为您订阅了Google群组上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
如需查看此讨论,请访问 https://groups.google.com/d/msgid/python-cn/tencent_E32D89D94A262303729CB07B6C184EC7C808%40qq.com


--
Best regards,
ᶘ ᵒᴥᵒᶅ
Reply all
Reply to author
Forward
0 new messages