Python >> Tutoriel Python >  >> Python Tag >> Linux

Rendre le script Python combiné avec des packages Linux faciles à installer pour l'utilisateur final

Je n'irais pas jusqu'à installer un logiciel sur un ordinateur/serveur car cela pourrait casser d'autres logiciels exécutés sur ce système. Au lieu de cela, je créerais un paquet deb et définirais les dépendances sur lesquelles le logiciel doit être installé pour guider l'utilisateur tout au long de l'installation.

1. Créer la structure du répertoire deb
Le répertoire deb contient les scripts/binaires finaux pour le package. source a votre code 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. Ajouter des fichiers
Ci-dessous, j'ai ajouté le contenu de chaque fichier. Vous devriez pouvoir l'implémenter selon vos besoins.

./Makefile :Ce fichier se charge de générer le source et le 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 :Le fichier de contrôle du gestionnaire de paquets de Debian.

Package: hello-world
Version: 1
Section: misc
Priority: optional
Architecture: all
Depends: libc6 (>= 2.24), python (>=2.7.13), virtualenv (>=1.11.6)
Maintainer: Your name <[email protected]>
Description: This is a deb package to install an application

./deb/DEBIAN/preinst :Le fichier dans lequel vous pouvez installer les packages Python. Il est exécuté avant l'installation de hello-world.py . Encore une fois, assurez-vous de ne pas simplement (ré)installer/mettre à jour une bibliothèque. Cela pourrait entraîner des problèmes d'incompatibilité avec d'autres logiciels.

#! /bin/bash
virtualenv -p /usr/bin/python3 venv/
source venv/bin/activate
pip install -r ./requirements.txt

./source/Makefile :Un fichier que j'ai utilisé pour tester cette configuration.

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

3. Installation et suppression L'installation est très simple, il suffit d'utiliser dpkg .

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

Une fonctionnalité intéressante à avoir est que vous n'avez pas à vous soucier de la version de votre logiciel, car cela se fait dans le control dossier. Debian propose un très bon didacticiel si vous souhaitez en savoir plus.

ÉDITER:
virtualenv ajouté à l'exemple. Les packages Python doivent être installés dans un environnement virtuel plutôt que globalement.


Je pense qu'un bon point de départ sera un Dockerfile, dans lequel vous partez d'une image Ubuntu, puis installez vos dépendances souhaitées (samtools, bwa) ainsi que les packages python (placés dans un requirements.txt)

  • pip freeze > requirements.txt pour avoir vos packages python souhaités (numpy, tqdm etc)
  • créer un Dockerfile (qui réside dans le même répertoire que requirements.txt) par exemple :

    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"]
    
  • construisez votre image docker docker built --tag repository/imagename . (DOT est le répertoire courant)

  • image de début docker run -dti --name test repository/imagename
  • entrer dans le conteneur pour commencer à travailler docker attach test
  • comme vous pouvez le voir, je l'ai testé et à l'intérieur du conteneur, j'ai tous les outils et packages souhaités
  • Si vous souhaitez ajouter de nouveaux outils, ajoutez-les simplement dans le Dockerfile et si vous souhaitez ajouter des packages python, développez simplement le fichier requirements.txt.

  • Si vous avez un script python qui fait quelque chose et que vous devez l'inclure dans le conteneur Docker, placez-le simplement dans le même répertoire avec le Dockerfile et requirements.txt et mettez à jour le Dockerfile (afin d'avoir un conteneur qui démarre votre script python ), plus précisément dans le Dockerfile la dernière ligne sera CMD [ "python", "./my_script.py" ]