Website-Suche

Paketieren von PyGObject-Anwendungen und -Programmen als ".deb"-Paket für den Linux-Desktop – Teil 4


Wir setzen die PyGObject-Programmierreihe mit Ihnen auf dem Linux-Desktop fort, im 4. Teil der Serie erklären wir, wie Sie die Programme und Anwendungen, die wir für den Linux-Desktop erstellt haben, mit PyGObject als Debian-Paket paketieren.

Debian-Pakete (.deb) sind das am häufigsten verwendete Format, um Programme unter Linux zu installieren, das "dpkg"-System, das sich mit .deb Paketen befasst, ist der Standard auf allen Debian-basierten Linux-Distributionen wie Ubuntu und Linux Mint. Aus diesem Grund erklären wir Ihnen nur, wie Sie unsere Programme für Debian paketieren.

Erstellen Sie ein Debian-Paket aus Ihren PyGObject-Anwendungen

Zuerst sollten Sie einige Grundkenntnisse über das Erstellen von Debian-Paketen haben, diese folgende Anleitung wird Ihnen sehr helfen.

  1. Einführung in die Debian-Paketierung

Kurz gesagt, wenn Sie ein Projekt mit dem Namen "myprogram" haben, muss es die folgenden Dateien und Ordner enthalten, damit Sie es packen können.

  1. debian (Ordner): Dieser Ordner enthält alle Informationen über das Debian-Paket, aufgeteilt in viele Unterdateien.
  2. po (Ordner): Der po-Ordner enthält die Übersetzungsdateien für das Programm (Wir erklären es in Teil 5).
  3. myprogram (Datei): Dies ist die Python-Datei, die wir mit PyGObject erstellt haben, es ist die Hauptdatei des Projekts.
  4. ui.glade (Datei): Die Datei für die grafische Benutzeroberfläche. Wenn Sie die Benutzeroberfläche der Anwendung mit Glade erstellt haben, müssen Sie diese Datei in
    Ihrem Projekt einschließen.
  5. bMyprogram.desktop (Datei): Dies ist die Datei, die für die Anzeige der Anwendung im Anwendungsmenü verantwortlich ist.
  6. setup.py (Datei): Diese Datei ist verantwortlich für die Installation eines Python-Programms auf dem lokalen System, sie ist sehr wichtig in jedem Python-Programm, sie hat auch viele andere Verwendungsmöglichkeiten.

Natürlich.. Es gibt viele andere Dateien und Ordner, die Sie in Ihr Projekt aufnehmen können (tatsächlich können Sie alles einfügen, was Sie möchten), aber das sind die grundlegenden.

Beginnen wir nun mit dem Verpacken eines Projekts. Erstellen Sie einen neuen Ordner mit dem Namen "myprogram", erstellen Sie eine Datei mit dem Namen "myprogram" und fügen Sie den folgenden Code hinzu.

#!/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()

Erstellen Sie eine ui.glade-Datei, und füllen Sie sie mit diesem 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>

Bis jetzt gibt es nichts Neues. Wir haben gerade eine Python-Datei und ihre Schnittstellendatei erstellt. Erstellen Sie nun eine "setup.py" -Datei im selben Ordner und fügen Sie den folgenden Code hinzu, jede Zeile wird in den Kommentaren erklärt.

# 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. 

Erstellen Sie nun eine Datei "myprogram.desktop " im selben Ordner und fügen Sie den folgenden Code hinzu, der auch in den Kommentaren erklärt wird.

# 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 

Wir sind jetzt fast fertig hier. Wir müssen nur einige kleine Dateien unter dem Ordner "debian" erstellen, um Informationen über unser Paket für das "dpkg"-System bereitzustellen.

Öffnen Sie den Ordner "debian" und erstellen Sie die folgenden Dateien.

control
compat
changelog
rules

control: Diese Datei enthält die grundlegenden Informationen über das Debian-Paket, für weitere Details besuchen Sie bitte Debian Package Control Fields.

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: Dies ist nur eine wichtige Datei für das dpkg-System, sie enthält nur die magische 9-Zahl, lassen Sie es so.

9

changelog: Hier können Sie die Änderungen hinzufügen, die Sie an Ihrem Programm vorgenommen haben, für weitere Informationen besuchen Sie bitte Debian Package Changelog Source.

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: Diese Datei ist für das Ausführen des Installationsprozesses auf dem lokalen Rechner verantwortlich, um das Paket zu installieren, Sie können weitere Informationen
zu dieser Datei hier einsehen: Debian Package Default Rules.

Mehr benötigen Sie jedoch nicht für Ihr Python-Programm.

#!/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:

Nachdem wir nun alle notwendigen Dateien für unser Programm erfolgreich erstellt haben, beginnen wir mit dem Verpacken. Stellen Sie zunächst sicher, dass Sie einige Abhängigkeiten für den Build-Prozess installiert haben, bevor Sie beginnen.

$ sudo apt-get update
sudo apt-get install devscripts

Stellen Sie sich nun vor, dass sich der Ordner "myprogram" in Ihrem Home-Ordner (/home/user/myprogram) befindet, um ihn als Debian-Paket zu verpacken, führen Sie die folgenden Befehle aus.

$ cd /home/user/myprogram
debuild -us -uc
Beispiel-Ausgabe
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.

Und das ist es! Ihr Debian-Paket wurde erfolgreich erstellt:

Um es auf einer beliebigen Debian-basierten Distribution zu installieren, führen Sie aus.

$ sudo dpkg -i myprogram_1.0_all.deb

Vergessen Sie nicht, die obige Datei durch den Namen des Pakets zu ersetzen. Nachdem Sie das Paket installiert haben, können Sie das Programm über das Anwendungsmenü ausführen.

Und es wird funktionieren.

Hier endet der 4. Teil unserer Serie über PyGObject. In der nächsten Lektion erklären wir Ihnen, wie Sie die PyGObject-Anwendung einfach lokalisieren können, bis dahin bleiben Sie dran...

Verwandte Artikel: