Сделать скрипт Python в сочетании с пакетами linux легко устанавливаемым для конечного пользователя - PullRequest
9 голосов
/ 06 июля 2019

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 15 июля 2019

Я не пошел бы так далеко, как установка программного обеспечения на некоторый компьютер / сервер, потому что это могло бы сломать другое программное обеспечение, работающее в этой системе. (Хотя вы не можете пропустить установку пакетов с 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 есть неплохое руководство по , если вы хотите больше читать.

2 голосов
/ 14 июля 2019

Я думаю, что хорошей отправной точкой будет файл Dockerfile, в котором вы начинаете с образа Ubuntu, а затем устанавливаете желаемые зависимости (samtools, bwa), а также пакеты python (помещенные в файл require.txt)

  • pip freeze > requirements.txt чтобы получить желаемые пакеты Python (numpy, tqdm и т. Д.)
  • создать Dockerfile (который находится в том же каталоге, что и needs.txt), например:

    FROM ubuntu:16.04
    
    RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y python && \
    apt-get install -y wget \
    curl \
    bc \
    unzip \
    less \
    bedtools \
    samtools \
    openjdk-8-jdk \
    tabix \
    bwa\
    python-pip\
    software-properties-common && \
    apt-get -y clean  && \
    apt-get -y autoclean  && \
    apt-get -y autoremove
    
    RUN mkdir -p /usr/src/app
    
    WORKDIR /usr/srv/app
    
    COPY . /usr/srv/app
    
    RUN pip install -r requirements.txt
    
    CMD ["/bin/bash"]
    
  • сборка образа Docker docker built --tag repository/imagename . (DOT - это текущий каталог)

  • стартовое изображение docker run -dti --name test repository/imagename
  • введите в контейнер, чтобы начать работать docker attach test
  • как видите, я проверил это, и внутри контейнера у меня есть все нужные инструменты и пакеты enter image description here

  • Если вы хотите добавить новые инструменты, просто добавьте их в Dockerfile, а если вы хотите добавить пакеты Python, просто разверните файл needs.txt.

  • Если у вас есть скрипт Python, который что-то делает, и вам нужно включить его в контейнер Docker, просто поместите его в тот же каталог, где находится Dockerfile и needs.txt, и обновите Dockerfile (чтобы иметь контейнер, который запускает ваш скрипт на Python), точнее в Dockerfile последняя строка будет CMD [ "python", "./my_script.py" ]

0 голосов
/ 14 июля 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...