gpt4 book ai didi

python - 在 NixOS 中,如何使用 Python 包 SpaCy、pandas 和 jenks-natural-breaks 安装环境?

转载 作者:行者123 更新时间:2023-12-05 07:30:05 28 4
gpt4 key购买 nike

我是 NixOS 的新手,所以请原谅我的无知。我只是想设置一个 Python 环境——任何类型的环境——用于使用 SpaCy、SpaCy 数据、pandas 和 jenks-natural-breaks 进行开发。到目前为止,这是我尝试过的:

  1. pypi2nix -V "3.6" -E gcc -E libffi -e spacy -e pandas -e numpy --default-overrides , 其次是 nix-build -r requirements.nix -A packages .我设法让第一个命令起作用,但第二个命令失败了 Could not find a version that satisfies the requirement python-dateutil>=2.5.0 (from pandas==0.23.4)

  2. 正在编写一个如下所示的 default.nix:with import <nixpkgs> {};
    python36.withPackages (ps: with ps; [ spacy pandas scikitlearn ])
    .这失败了 collision between /nix/store/9szpqlby9kvgif3mfm7fsw4y119an2kb-python3.6-msgpack-0.5.6/lib/python3.6/site-packages/msgpack/_packer.cpython-36m-x86_64-linux-gnu.so and /nix/store/d08bgskfbrp6dh70h3agv16s212zdn6w-python3.6-msgpack-python-0.5.6/lib/python3.6/site-packages/msgpack/_packer.cpython-36m-x86_64-linux-gnu.so

  3. 创建一个新的 virtualenv,然后运行 ​​pip install在所有这些包上。 Scikit-learn 安装失败,fish: Unknown command 'ar rc build/temp.linux-x86_64-3.6/liblibsvm-skl.a build/temp.linux-x86_64-3.6/sklearn/svm/src/libsvm/libsvm_template.o'

我想理想情况下我想用 nix 安装这个环境,这样我就可以用 nix-shell 进入它,这样其他环境就可以重用相同的 python 包。我该怎么做呢?特别是因为其中一些包存在于 nixpkgs 中,而其他包仅存在于 Pypi 上。

最佳答案

警告

我遇到了 jenks-natural-breaks 的问题调到

nix-shell ❯ poetry run python -c 'import jenks_natural_breaks'
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/matt/2022/12/28-2/.venv/lib/python3.10/site-packages/jenks_natural_breaks/__init__.py", line 5, in <module>
from ._jenks_matrices import ffi as _ffi
ModuleNotFoundError: No module named 'jenks_natural_breaks._jenks_matrices'

所以我要使用 jenkspy这似乎有点活泼。如果这不能解决您的问题,我会联系 jenks-natural-breaks 的维护者指导

薄片

你说:

so other environments could reuse the same python packages

这让我觉得 flake.nix是你需要的。 flakes 的妙处在于您可以定义一个具有 spacy 的环境。 , pandas , 和 jenkspy用一片。然后你(或其他人)可能会说:

I want an env like Jonathan's, except I also want sympy

与其复制您的环境并进行调整,他们可以将您的环境声明为构建输入并编写 flake.nix与他们的修改 - 可以由其他人进一步修改。

人们可以想象一种环境家族树,因此您只需选择适合您任务的环境即可。 Python 社区尚未就此愿景达成共识。

诗歌

当您只需要一个环境时,Poetry 会像您尝试发布一个库一样对待您,但是库的依赖项几乎就是一个环境,因此拥有一个空包并仅使用 poetry 作为环境并没有错工厂。

奖励:如果您最终决定发布一个库,那么您就准备好了。

设置

nix flakes 从 git repo 的角度思考,所以我们从一个开始:

$ git init

然后创建一个名为 flake.nix 的文件.通常我最终会用诗歌处理 90% 的 python 内容,但两者都是 pandasspacy在那 10% 中有链接到系统库的依赖项。所以我们要求 nix 安装它们,以便当 poetry 尝试将它们安装在 nix develop 中时。 shell,它有它需要的东西。

{
description = "Jonathan's awesome env";

inputs = {
nixpkgs.url = "github:nixos/nixpkgs";
};


outputs = { self, nixpkgs, flake-utils }: (flake-utils.lib.eachSystem [
"x86_64-linux"
"x86_64-darwin"
"aarch64-linux"
"aarch64-darwin"
] (system:
let
pkgs = nixpkgs.legacyPackages.${system};
in
rec {
packages.jonathansenv = pkgs.poetry2nix.mkPoetryApplication {
projectDir = ./.;
};

defaultPackage = packages.jonathansenv;

devShell = pkgs.mkShell {
buildInputs = [
pkgs.poetry
pkgs.python310Packages.pandas
pkgs.python310Packages.spacy
];
};
}));
}

现在我们让 git 知道 flake 并进入环境:

❯ git add flake.nix
❯ nix develop
$

然后我们初始化诗歌项目。我发现由 nix 安装的 poetry 对于它默认使用的 python 有点奇怪,所以我们将明确设置它

$ poetry init  # follow prompts
$ poetry env use $(which python)
$ poetry run python --version
Python 3.10.9 # declared in the flake.nix

此时,我们应该有一个 pyproject.toml :

[tool.poetry]
name = "jonathansenv"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.10"
jenkspy = "^0.3.2"
spacy = "^3.4.4"
pandas = "^1.5.2"


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

用法

现在我们创建 poetry 将使用的 venv,并运行依赖于这些的命令。

$ poetry install
$ poetry run python -c 'import jenkspy, spacy, pandas'

你也可以让诗歌把你装进一个壳里:

$ poetry shell
(venv)$ python -c 'import jenkspy, spacy, pandas'

虽然这样做有点尴尬,因为我们有两个子 shell 深度,并且我们拥有祖父 shell 的任何 shell 定制都不可用。所以我建议使用 direnv , 每当我导航到该目录时进入 dev shell 然后只使用 poetry run ...在环境中运行命令。

发布环境

除了运行 nix developflake.nix在您当前的目录中,您还可以执行 nix develop /local/path/to/repodevelop nix develop github:/githubuser/githubproject达到相同的结果。

为了演示 github 示例,我已经推送了上面引用的文件 here .所以你应该能够从任何安装了 nix 的 linux shell 运行它:

❯ nix develop github:/MatrixManAtYrService/nix-flake-pandas-spacy
$ poetry install
$ poetry run python -c 'import jenkspy, spacy, pandas'

我说“应该”是因为如果我在 Mac 上运行该命令它会提示 linux-headers-5.19.16x86_64-darwin 上不受支持.

大概有一种方法可以编写 flake(或修复程序包),这样它就不会坚持在 mac 上构建 linux 的东西,但在我弄清楚之前,恐怕这只是部分答案。

关于python - 在 NixOS 中,如何使用 Python 包 SpaCy、pandas 和 jenks-natural-breaks 安装环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52490426/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com