如何在flake.nix定义的Jupyter服务器中安装Python包?权限问题求助
解决Nix Jupyter环境中pip安装权限问题
我想跟着Colab上的教程跑代码,但不想注册谷歌账号,于是用Nix搭了Jupyter服务器,flake.nix配置如下:
{ inputs = { nixpkgs = { url = "github:nixos/nixpkgs/nixos-unstable"; }; flake-utils = { url = "github:numtide/flake-utils"; }; }; outputs = { nixpkgs, flake-utils, ... }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; in rec { devShell = pkgs.mkShell { buildInputs = with pkgs; [ (python3.withPackages(ps: with ps; [ ipython matplotlib tensorflow python3Packages.opencv4 python3Packages.pip pillow scipy ])) ]; shellHook = "jupyter notebook"; }; } ); }
执行nix develop启动服务器后,在Notebook里运行以下代码时:
!pip install -q xplique import numpy as np from matplotlib import pyplot as plt import tensorflow as tf from math import ceil import cv2 %matplotlib inline %config InlineBackend.figure_format='retina' import xplique from xplique.plots import plot_attributions
出现权限错误:
ERROR: Could not install packages due to an OSError: [Errno 13] Permission denied: '/nix/store/a7k1ggpnhsrzpfcsw3dyw12kzl7j2vq5-python3-3.10.10-env/lib/python3.10/site-packages/tifffile'
Check the permissions.
方案1:将xplique添加到flake.nix的依赖列表(推荐)
Nix构建的Python环境位于只读的/nix/store目录,无法直接通过pip修改。最贴合Nix工作流的方式是直接在flake配置中声明xplique作为依赖:
修改flake.nix中python3.withPackages的包列表,添加xplique:
(python3.withPackages(ps: with ps; [ ipython matplotlib tensorflow python3Packages.opencv4 python3Packages.pip pillow scipy xplique # 新增该行 ]))
修改完成后,重新执行nix develop启动Jupyter。此时xplique已被预装,无需再用pip安装,直接运行导入代码即可。
方案2:使用Python虚拟环境临时安装
如果不想修改flake配置,可以通过虚拟环境隔离安装:
- 在Notebook的第一个单元格运行以下命令创建并激活虚拟环境,安装xplique:
!python -m venv ./myenv !source ./myenv/bin/activate && pip install -q xplique
- 重启Jupyter内核(点击页面顶部菜单栏的「Kernel」→「Restart」)
- 重启后,在单元格中添加虚拟环境的包路径,再导入所需库:
import sys sys.path.insert(0, './myenv/lib/python3.10/site-packages') import numpy as np from matplotlib import pyplot as plt import tensorflow as tf from math import ceil import cv2 %matplotlib inline %config InlineBackend.figure_format='retina' import xplique from xplique.plots import plot_attributions
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

