Я написал скрипт на python, который использует numpy, multiprocessing, tqdm и feq другие библиотеки Python. Кроме того, я запускаю пакеты (например, samtools, bwa, GATK), которые необходимо установить в linux (apt-get install).

Я хотел бы как-то обернуть все эти зависимости, чтобы сделать окончательную установку максимально удобной и стабильной.

Кажется, что pip здесь не вариант, так как для моего примера включены не-python-пакеты.

Может быть, возможно Docker или создание среды conda со всеми этими зависимостями, но я не совсем понял, как с этим справиться.

9
Nicolas 6 Июл 2019 в 20:53

2 ответа

Лучший ответ

Я не пошел бы так далеко, как установка программного обеспечения на некоторый компьютер / сервер, потому что это могло бы сломать другое программное обеспечение, работающее в этой системе. (Хотя вы не можете пропустить установку пакетов с pip). Вместо этого я бы создал пакет deb и установил зависимости, на которых должно быть установлено программное обеспечение, чтобы помочь пользователю при установке.

< Сильный > 1 . Создать структуру каталогов deb
В каталоге deb содержатся последние скрипты / двоичные файлы для пакета. source содержит ваш код Python.

$ cd $HOME/path/to/some/directory
$ mkdir -p ./deb/DEBIAN ./source
$ touch ./Makefile ./source/Makefile ./deb/DEBIAN/{control,preinst} ./source/hello-world.py
$ chmod +x ./deb/DEBIAN/preinst

< Сильный > 2 . Добавить файлы
Ниже я добавил содержание каждого файла. Вы должны быть в состоянии реализовать это в соответствии с вашими потребностями.

./ Makefile . Этот файл отвечает за создание исходного кода и deb.

PACKAGE         := hello-world

DEB_DIR         := deb
DEB_FILE        := $(PACKAGE).deb

SOURCE_DIR      := source
SOURCE_IN       := $(SOURCE_DIR)/$(PACKAGE).py
SOURCE_OUT      := $(DEB_DIR)/usr/bin/

.PHONY: all clean
all:
        @make -C $(SOURCE_DIR) CROSS_COMPILE=$(CROSS_COMPILE)
        @mkdir -p $(SOURCE_OUT)
        @cp -r $(SOURCE_IN) $(SOURCE_OUT)
        @chmod -R a-s $(DEB_DIR)
        @dpkg-deb --build $(DEB_DIR) $(DEB_FILE)

clean:
        @rm -rf $(DEB_FILE) $(SOURCE_OUT)
        @make -C $(SOURCE_DIR) clean

./ deb / DEBIAN / control : управляющий файл для менеджера пакетов Debian.

Package: hello-world
Version: 1
Section: misc
Priority: optional
Architecture: all
Depends: libc6 (>= 2.24), python (>=2.7.13)
Maintainer: Your name <your-name@domain.org>
Description: This is a deb package to install an application

./ deb / DEBIAN / preinst . Файл, в который можно устанавливать пакеты Python. Он запускается перед установкой hello-world.py. Опять же, убедитесь, что вы не просто (пере) устанавливаете / обновляете библиотеку. Это может вызвать проблемы несовместимости в другом программном обеспечении.

#! /bin/bash
echo "pip install something"

./ source / Makefile : файл, который я использовал для проверки этой настройки.

MYFILE=hello-world.py
all:
        @echo "#!/usr/bin/python\n\
        print('Hello world!')" > $(MYFILE)
        @chmod +x $(MYFILE)
clean:
        @rm $(MYFILE)

< Сильный > 3 . Установка и удаление Установка очень проста, просто используйте dpkg.

dpkg -i hello-world.deb # for installation
dpkg -r hello-world     # for removal

Приятная особенность: вам не нужно беспокоиться о версии программного обеспечения, поскольку это делается в файле control. У Debian есть довольно хорошее руководство, если вам интересно узнать больше.

7
Bayou 15 Июл 2019 в 15:52

Наиболее распространенные способы использования стороннего программного обеспечения в Linux - это предоставление сценария (или интерфейса GUI, запускающего сценарий), который выполняет все необходимые команды.

Более предпочтительно, вы можете отправлять в определенном формате пакета дистрибутива. Это обеспечит постоянное отслеживание ваших зависимостей системным менеджером пакетов - за счет того, что вы будете ограничены конкретным дистрибутивом (или семейством связанных дистрибутивов), а также убедитесь, что ваши зависимости также поставляются в том же формате. и доступны для пользователя.

Некоторые дистрибутивы предоставляют другие способы, которые полагаются на дополнительные подсистемы, присутствующие в системе; например Canonical предлагает формат «мгновенного» распространения, который запускается через одноименную подсистему. Плюсы и минусы здесь заключаются в том, что такие среды изолируют вашу программу от остальной системы: работают в любом месте, которое поддерживает подсистема, и не заботятся о конфликтах пакетов, за счет необходимости потенциально связывать все зависимости (таким образом, потеря их бесплатного обслуживания) и серьезные ограничения на то, что ваша программа может использовать и взаимодействовать с другими частями системы.

0
ivan_pozdeev 13 Июл 2019 в 23:00