В NixOS, как я могу установить среду с пакетами Python SpaCy, pandas и jenks-natural-breaks?

Я очень новичок в NixOS, поэтому, пожалуйста, прости мое невежество. Я просто пытаюсь настроить среду Python - любую среду - для разработки с SpaCy, данными SpaCy, пандами и 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.

1 ответ

Предостережение

У меня были проблемы с 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'

Так что я собираюсь использовать jenkospy , который кажется немного более живым. Если это не удовлетворит ваш зуд, я бы связался с сопровождающимjenks-natural-breaksдля руководства

Хлопья

Вы сказали:

чтобы другие среды могли повторно использовать одни и те же пакеты Python

Это заставляет меня думать, что это то, что вам нужно. Что хорошо в хлопьях, так это то, что вы можете определить среду, которая имеет , , иjenkspyс одной чешуей. И тогда вы (или кто-то другой) можете сказать:

Я хочу окружение, как у Джонатана, за исключением того, что я также хочуsympy

и вместо того, чтобы копировать вашу оболочку и вносить изменения, они могут объявить вашу оболочку в качестве входных данных сборки и написать со своими модификациями, которые могут быть дополнительно изменены другими.

Можно представить своего рода генеалогическое древо сред, поэтому вам просто нужно выбрать ту, которая подходит для вашей задачи. Сообщество Python еще не пришло к такому видению.

Поэзия

Poetry будет относиться к вам так, как будто вы пытаетесь опубликовать библиотеку, когда все, что вам нужно, это среда, но зависимости библиотеки в значительной степени являются средой, поэтому нет ничего плохого в том, чтобы иметь пустой пакет и просто использовать поэзию в качестве фабрики среды.

Бонус: если вы все-таки решите опубликовать библиотеку, вы готовы.

Установка

nix flakes мыслит с точки зрения репозиториев git, поэтому мы начнем с одного:

      $ git init

Затем создайте файл с именем . Обычно я заканчиваю поэзией, обрабатывающей 90% материала Python, но и то, и другоеpandasиspacyвходят в те 10%, которые имеют зависимости, ссылающиеся на системные библиотеки. Поэтому мы просим nix установить их, чтобы когда поэзия попытается установить их в оболочке, у нее было то, что ей нужно.

      {
  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 о флейке и входим в окружение:

      ❯ git add flake.nix
❯ nix develop
$

Затем мы инициализируем проект поэзии. Я обнаружил, что поэзия, установленная nix, довольно странно относится к тому, какой 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"

Применение

Теперь мы создаем venv, который будет использовать поэзия, и запускаем команду, которая зависит от них.

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

Вы также можете сделать так, чтобы поэзия поместила вас в скорлупу:

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

Однако это довольно неудобно делать, потому что у нас две подоболочки в глубину, и любые настройки оболочки, которые у нас есть в прародительской оболочке, недоступны. Поэтому я рекомендую использовать direnv для входа в оболочку разработчика всякий раз, когда я перехожу к этому каталогу, а затем просто используюpoetry run ...для запуска команд в среде.

Публикация окружения

В дополнение к бегуnix developсflake.nixв вашем текущем каталоге вы также можете сделатьnix develop /local/path/to/repoилиdevelop nix develop github:/githubuser/githubprojectдля достижения того же результата.

Чтобы продемонстрировать пример с github, я засунул файлы, на которые есть ссылки выше, сюда. Таким образом, вы должны иметь возможность запускать это из любой оболочки Linux с установленным nix:

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

Я говорю «должен», потому что, если я запускаю эту команду на Mac, она жалуется наlinux-headers-5.19.16отсутствие поддержки наx86_64-darwin.

Предположительно, есть способ написать флейк (или исправить пакет), чтобы он не настаивал на сборке Linux на Mac, но пока я не выясню это, я боюсь, что это только частичный ответ.

Другие вопросы по тегам