2013-07-01 5 views
17

butdebianzing un programme python pour obtenir un .deb

Pour créer un fichier .deb installable (ou package). Lequel, une fois cliqué, installerait le logiciel sur une machine Linux et une icône serait placée sur le panneau GNOME. Afin de lancer cette application à partir de là.

Ce que j'ai parlé

j'ai parlé deux guides debianiser.

Guide 1

Guide 2

Le premier avait une vidéo qui était impossible à comprendre, en partie à cause de l'accent et en partie parce qu'il était désespérément obsolète. (Il a été chargé en 2007)

Et le second était complètement texte. J'ai eu jusqu'à la 4ème étape, construit le paquet. Mais quand je l'ai fait, j'ai eu un résultat qui ne correspondait pas à ce qui était indiqué dans le guide.

Ce que je requiers

J'ai un programme simple de python. Cela prend votre âge et ensuite les impressions si l'âge est inférieur, égal ou supérieur à 18 ans. Il n'y a qu'un seul fichier et aucune autre dépendance pour ce programme. Et je veux construire ceci dans un .deb.

Spécifications

-python 2.7

-Linux Mint

Modifier

I a suivi la même structure de répertoires que vous avez demandé que vous. Et remplacé tous myscript avec cowsandbulls. La construction terminée et j'ai eu le debian. Quand je l'ai installé et couru la commande cowsandbulls du terminal I obtenu l'erreur suivante:

Traceback (most recent call last): 
    File "/usr/bin/cowsandbulls", line 9, in <module> 
    load_entry_point('cowsandbulls==1.0', 'gui_scripts', 'cowsandbulls')() 
    File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 337, in load_entry_point 
    return get_distribution(dist).load_entry_point(group, name) 
    File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2311, in load_entry_point 
    return ep.load() 
    File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2017, in load 
    entry = __import__(self.module_name, globals(),globals(), ['__name__']) 
ImportError: No module named cowsandbulls 

Répondre

21

Je viens de tester stdeb (voir https://pypi.python.org/pypi/stdeb) un paquet Python pour transformer tout autre package Python dans un paquet Debian.

D'abord, j'installé stdeb:

apt-get install python-stdeb 

Alors je fait un script simple appelé myscript.py avec le contenu suivant:

def main(): 
    print "Hello world, says myscript!" 
    # wait for input from the user 
    raw_input() 

if __name__ == '__main__': 
    main() 

Fait important, la structure de votre répertoire devrait être:

somewhere/myscript/ 
    setup.py 
    myscript/ 
     __init__.py 
     myscript.py 

Dans la configuration.py, vous faites quelque chose comme:

import os 
from setuptools import setup 
from nvpy import nvpy 

setup(
    name = "myscript", 
    version = "1.0", 
    author = "Charl P. Botha", 
    author_email = "[email protected]", 
    description = "Demo of packaging a Python script as DEB", 
    license = "BSD", 
    url = "https://github.com/cpbotha/nvpy", 
    packages=['myscript'], 
    entry_points = { 
     'console_scripts' : ['myscript = myscript.myscript:main'] 
    }, 
    data_files = [ 
     ('share/applications/', ['vxlabs-myscript.desktop']) 
    ], 
    classifiers=[ 
     "License :: OSI Approved :: BSD License", 
    ], 
) 

La directive console_scripts est important, il va créer un script exécutable appelé my_script, qui sera disponible à l'échelle du système après avoir installé la DEB résultante. Si votre script utilise quelque chose comme tkinter ou wxpython et dispose d'une interface utilisateur graphique, vous devez utiliser gui_scripts au lieu de console_scripts.

La directive data_files va installer un fichier de bureau approprié dans /usr/share/applications, de sorte que vous pouvez également démarrer myscript à partir de votre environnement de bureau. vxlabs-myscript.desktop ressemble à ceci:

[Desktop Entry] 
Version=1.0 
Type=Application 
Name=myscript 
Comment=Minimal stdeb example 
# myscript should wait for user input at the end, else the terminal 
# window will disappear immediately. 
Exec=myscript 
Icon=/usr/share/icons/gnome/48x48/apps/file-manager.png 
Categories=Utility; 
# desktop should run this in a terminal application 
Terminal=true 
StartupNotify=true 
StartupWMClass=myscript 

Pour construire la DEB, vous effectuez les opérations suivantes dans le haut niveau myscript:

python setup.py --command-packages=stdeb.command bdist_deb 

qui va créer un .deb dans le répertoire deb_dist.

Après avoir installé le DEB que j'ai créé comme ceci, je pourrais courir myscript de la ligne de commande, et je pourrais également l'invoquer de mon environnement de bureau.

est ici un repo github avec le code exemple ci-dessus: https://github.com/cpbotha/stdeb-minimal-example

+0

Monsieur: quel doit être le contenu de '__init __ py'.? – IcyFlame

+1

'__init __. Py' est un fichier vide, mais vous devez l'avoir, sinon le répertoire' myscript' le plus interne n'est pas considéré comme un paquet, et ne sera pas importable. Le lien github que j'ai posté au bas de ma réponse a tout le code. –

+0

Puis-je changer le point d'entrée au nom d'une autre fonction? – IcyFlame

1

La bonne façon de construire un paquet deb utilise dpkg-buildpackage mais parfois il est un peu compliqué. Au lieu de cela, vous pouvez utiliser dpkg -b <folder> et il va créer votre paquet Debian.

Ce sont les bases pour la création d'un paquet Debian avec dpkg -b <folder> avec un binaire ou avec tout type de script qui exécute automatiquement sans avoir besoin compilation manuelle (Python, Bash, Pearl, Ruby):

  1. Créer les fichiers et les dossiers afin de recréer la structure suivante:
ProgramName-Version/ 
    ProgramName-Version/DEBIAN 
    ProgramName-Version/DEBIAN/control 
    ProgramName-Version/usr/ 
    ProgramName-Version/usr/bin/ 
    ProgramName-Version/usr/bin/your_script 

les scripts placés à /usr/bin/ sont directement appelés à partir du terminal, notez que je ne l'ai pas ajouter une extension à l'scr ipt. Aussi, vous pouvez remarquer que la structure du paquet deb sera la structure du programme une fois installé. Donc si vous suivez cette logique si votre programme a un seul fichier, vous pouvez directement le placer sous ProgramName-Version/usr/bin/your_script, mais si vous avez plusieurs fichiers, vous devez les placer sous ProgramName-Version/usr/share/ProgramName/all your files et placer un seul fichier sous /usr/bin/ qui appellera vos scripts de /usr/share/ProgramName/

  1. Modifier toutes les autorisations du dossier à la racine:

    chown root:root -R /path/to/ProgramName-Version 
    
  2. Modifier les autorisations de script:

    chmod 0755 /path/to/the/script 
    
  3. Enfin, vous pouvez exécuter: dpkg -b /path/to/the/ProgramName-Version et votre paquet deb sera créé!(Vous pouvez également ajouter les scripts post/pré inst et tout ce que vous voulez, il fonctionne comme un paquet Debian normale)


Voici un exemple du fichier control. Il vous suffit de copier-coller dans un fichier vide appelé « contrôle » et le mettre dans le dossier DEBIAN

Package: ProgramName 
Version: VERSION 
Architecture: all 
Maintainer: YOUR NAME <EMAIL> 
Depends: python2.7, etc , etc, 
Installed-Size: in_kb 
Homepage: http://foo.com 
Description: Here you can put a one line description. This is the short Description. 
Here you put the long description, indented by 1 space. 

Si vous voulez construire en utilisant dpkg -b <folder> vous pouvez utiliser this program qui fera tout avec une commande. Si vous construisez régulièrement des paquets, c'est une douleur de faire tout ce que j'ai mentionné!

* Le guide a été pris de Basics of Debian Packages

Questions connexes