Package PyGObject Applications and Programs en tant que package « .deb » pour le bureau Linux - Partie 4
Nous continuons la série de programmation PyGObject avec vous sur le bureau Linux, dans la 4ème partie de la série, nous expliquerons comment empaqueter les programmes et applications que nous avons créés pour le bureau Linux en utilisant PyGObject comme paquet Debian.
Les paquets Debian (.deb) sont le format le plus utilisé pour installer des programmes sous Linux, le système « dpkg » qui s’occupe des paquets .deb est le format par défaut sur toutes les distributions Linux basées sur Debian comme Ubuntu et Linux Mint. C’est pourquoi nous allons seulement expliquer comment empaqueter nos programmes pour Debian.
Créez un paquet Debian à partir de vos applications PyGObject
Tout d’abord, vous devriez avoir quelques connaissances de base sur la création de paquets Debian, ce guide suivant vous aidera beaucoup.
- Introduction à l’empaquetage Debian
En bref, si vous avez un projet appelé « monprogramme », il doit contenir les fichiers et dossiers suivants pour que vous puissiez l’empaqueter.
- debian (Folder) : Ce dossier contient toutes les informations sur le paquet Debian divisées en plusieurs sous-fichiers.
- po (Dossier) : Le dossier po comprend les fichiers de traduction du programme (nous l’expliquerons dans la partie 5).
- myprogram (File) : C’est le fichier Python que nous avons créé à l’aide de PyGObject, c’est le fichier principal du projet.
- ui.glade (File) : Le fichier de l’interface utilisateur graphique. Si vous avez créé l’interface de l’application à l’aide de Glade, vous devez inclure ce fichier dans
votre projet. - bMonprogramme.bureau (Fichier) : Il s’agit du fichier responsable de l’affichage de l’application dans le menu des applications.
- setup.py (Fichier) : Ce fichier est responsable de l’installation de tout programme Python dans le système local, il est très important dans tout programme Python, il a également de nombreuses autres façons de l’utiliser.
Bien sûr.. Il existe de nombreux autres fichiers et dossiers que vous pouvez inclure dans votre projet (en fait, vous pouvez inclure tout ce que vous voulez), mais ce sont les plus basiques.
Commençons maintenant à empaqueter un projet. Créez un nouveau dossier appelé « myprogram », créez un fichier appelé « myprogram » et ajoutez-y le code suivant.
#!/usr/bin/python
-*- coding: utf-8 -*-
## Replace your name and email.
My Name <[email >
## Here you must add the license of the file, replace "MyProgram" with your program name.
License:
MyProgram is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MyProgram is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with MyProgram. If not, see <http://www.gnu.org/licenses/>.
from gi.repository import Gtk
import os
class Handler:
def openterminal(self, button):
## When the user clicks on the first button, the terminal will be opened.
os.system("x-terminal-emulator ")
def closeprogram(self, button):
Gtk.main_quit()
Nothing new here.. We just imported the 'ui.glade' file.
builder = Gtk.Builder()
builder.add_from_file("/usr/lib/myprogram/ui.glade")
builder.connect_signals(Handler())
window = builder.get_object("window1")
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
Créez un fichier ui.glade et remplissez-le avec ce code.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<interface>
<requires lib="gtk+" version="3.10"/>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<property name="title" translatable="yes">My Program</property>
<property name="window_position">center</property>
<property name="icon_name">applications-utilities</property>
<property name="gravity">center</property>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="orientation">vertical</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Welcome to this Test Program !</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button2">
<property name="label" translatable="yes">Click on me to open the Terminal</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="openterminal" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button3">
<property name="label">gtk-preferences</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button4">
<property name="label">gtk-about</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="label">gtk-close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="closeprogram" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
Il n’y a rien de nouveau jusqu’à présent. Nous venons de créer un fichier Python et son fichier d’interface. Créez maintenant un fichier « setup.py » dans le même dossier, et ajoutez-y le code suivant, chaque ligne est expliquée dans les commentaires.
# Here we imported the 'setup' module which allows us to install Python scripts to the local system beside performing some other tasks, you can find the documentation here: https://docs.python.org/2/distutils/apiref.html
from distutils.core import setup
setup(name = "myprogram", # Name of the program.
version = "1.0", # Version of the program.
description = "An easy-to-use web interface to create & share pastes easily", # You don't need any help here.
author = "TecMint", # Nor here.
author_email = "[email ",# Nor here :D
url = "http://example.com", # If you have a website for you program.. put it here.
license='GPLv3', # The license of the program.
scripts=['myprogram'], # This is the name of the main Python script file, in our case it's "myprogram", it's the file that we added under the "myprogram" folder.
Here you can choose where do you want to install your files on the local system, the "myprogram" file will be automatically installed in its correct place later, so you have only to choose where do you want to install the optional files that you shape with the Python script
data_files = [ ("lib/myprogram", ["ui.glade"]), # This is going to install the "ui.glade" file under the /usr/lib/myprogram path.
("share/applications", ["myprogram.desktop"]) ] ) # And this is going to install the .desktop file under the /usr/share/applications folder, all the folder are automatically installed under the /usr folder in your root partition, you don't need to add "/usr/ to the path.
Créez maintenant un fichier « myprogram.desktop » dans le même dossier, et ajoutez le code suivant, c’est également expliqué dans les commentaires.
# This is the .desktop file, this file is the responsible file about showing your application in the applications menu in any desktop interface, it's important to add this file to your project, you can view more details about this file from here: https://developer.gnome.org/integration-guide/stable/desktop-files.html.en
[Desktop Entry]
The default name of the program.
Name=My Program
The name of the program in the Arabic language, this name will be used to display the application under the applications menu when the default language of the system is Arabic, use the languages codes to change the name for each language.
Name[ar]=برنامجي
Description of the file.
Comment=A simple test program developed by me.
Description of the file in Arabic.
Comment[ar]=برنامج تجريبي بسيط تم تطويره بواسطتي.
The command that's going to be executed when the application is launched from the applications menu, you can enter the name of the Python script or the full path if you want like /usr/bin/myprogram
Exec=myprogram
Do you want to run your program from the terminal?
Terminal=false
Leave this like that.
Type=Application
Enter the name of the icon you want to use for the application, you can enter a path for the icon as well like /usr/share/pixmaps/icon.png but make sure to include the icon.png file in your project folder first and in the setup.py file as well. Here we'll use the "system" icon for now.
Icon=system
The category of the file, you can view the available categories from the freedesktop website.
Categories=GNOME;GTK;Utility;
StartupNotify=false
Nous en avons presque fini ici maintenant. Il suffit de créer quelques petits fichiers sous le dossier « debian » afin de fournir des informations sur notre paquet pour le système « dpkg ».
Ouvrez le dossier « debian », et créez les fichiers suivants.
control
compat
changelog
rules
control : Ce fichier fournit les informations de base sur le paquet Debian, pour plus de détails, veuillez consulter les champs de contrôle du paquet Debian.
Source: myprogram
Maintainer: My Name <[email >
Section: utils
Priority: optional
Standards-Version: 3.9.2
Build-Depends: debhelper (>= 9), python2.7
Package: myprogram
Architecture: all
Depends: python-gi
Description: My Program
Here you can add a short description about your program.
compat : C’est juste un fichier important pour le système dpkg, il inclut juste le nombre magique 9, laissez-le comme ça.
9
changelog : Ici, vous pourrez ajouter les modifications que vous apportez à votre programme, pour plus d’informations, veuillez consulter la source du journal des modifications du paquet Debian.
myprogram (1.0) trusty; urgency=medium
* Add the new features here.
* Continue adding new changes here.
* And here.
-- My Name Here <[email > Sat, 27 Dec 2014 21:36:33 +0200
rules : Ce fichier est responsable de l’exécution du processus d’installation sur la machine locale pour installer le paquet, vous pouvez voir plus d’informations
sur ce fichier à partir d’ici : Règles par défaut du paquet Debian.
Bien que vous n’ayez besoin de rien de plus pour votre programme Python.
#!/usr/bin/make -f
This file is responsible about running the installation process on the local machine to install the package, you can view more information about this file from here: https://www.debian.org/doc/manuals/maint-guide/dreq.en.html#defaultrules Though you won't need anything more for your Python program.
%:
dh $@
override_dh_auto_install:
python setup.py install --root=debian/myprogram --install-layout=deb --install-scripts=/usr/bin/ # This is going to run the setup.py file to install the program as a Python script on the system, it's also going to install the "myprogram" script under /usr/bin/ using the --install-scripts option, DON'T FORGET TO REPLACE "myprogram" WITH YOUR PROGRAM NAME.
override_dh_auto_build:
Maintenant que nous avons créé tous les fichiers nécessaires à notre programme avec succès, commençons maintenant à l’empaqueter. Tout d’abord, assurez-vous d’avoir installé certaines dépendances pour le processus de génération avant de commencer.
$ sudo apt-get update
sudo apt-get install devscripts
Imaginez maintenant que le dossier « myprogram » se trouve dans votre dossier personnel (/home/user/myprogram) afin de l’empaqueter en tant que paquet Debian, exécutez les commandes suivantes.
$ cd /home/user/myprogram
debuild -us -uc
Exemple de sortie
hanny@hanny-HP-Pavilion-15-Notebook-PC:~/Projects/myprogram$
debuild -us -uc dpkg-buildpackage -rfakeroot -D -us -uc
dpkg-buildpackage: source package myprogram
dpkg-buildpackage: source version 1.0
dpkg-buildpackage: source distribution trusty
dpkg-buildpackage: source changed by My Name Here
<[email >
dpkg-source --before-build myprogram
dpkg-buildpackage: host architecture i386
fakeroot debian/rules clean
dh clean
dh_testdir
dh_auto_clean
....
.....
Finished running lintian.
Et c’est tout ! Votre paquet Debian a été créé avec succès :
Pour l’installer sur n’importe quelle distribution basée sur Debian, exécutez.
$ sudo dpkg -i myprogram_1.0_all.deb
N’oubliez pas de remplacer le fichier ci-dessus par le nom du paquet. Maintenant, après avoir installé le package, vous pouvez exécuter le programme à partir du menu des applications.
Et ça marchera...
Ici se termine la 4ème partie de notre série sur PyGObject. Dans la prochaine leçon, nous expliquerons comment localiser facilement l’application PyGObject, d’ici là, restez à l’affût...





