ウェブサイト検索

PyGObject アプリケーションとプログラムを Linux デスクトップ用の「.deb」パッケージとしてパッケージ化する – パート 4


Linux デスクトップでの PyGObject プログラミング シリーズを続けます。シリーズの 第 4 回 パートでは、Linux デスクトップ用に作成したプログラムとアプリケーションをパッケージ化する方法について説明します。 Debian パッケージとして PyGObject を使用する Linux デスクトップ。

Debian パッケージ (.deb) は、Linux でプログラムをインストールするために最もよく使用される形式です。.deb パッケージを扱う「dpkg 」システムはUbuntu や Linux Mint などのすべての Debian ベースの Linux ディストリビューションのデフォルトです。そのため、ここでは Debian 用にプログラムをパッケージ化する方法のみを説明します。

PyGObject アプリケーションから Debian パッケージを作成する

まず、Debian パッケージの作成に関する基本的な知識を持っている必要があります。この次のガイドは非常に役立ちます。

  1. Debian パッケージングの概要

簡単に言うと、「myprogram 」というプロジェクトがある場合、パッケージ化するには次のファイルとフォルダーが含まれている必要があります。

  1. debian (フォルダ): このフォルダには、多くのサブファイルに分割された Debian パッケージに関するすべての情報が含まれています。
  2. po (フォルダー): po フォルダーには、プログラムの翻訳ファイルが含まれています (パート 5 で説明します)。
  3. myprogram (ファイル): これは PyGObject を使用して作成した Python ファイルで、プロジェクトのメイン ファイルです。
  4. ui.glade (ファイル): グラフィカル ユーザー インターフェイス ファイル。Glade を使用してアプリケーションのインターフェイスを作成した場合は、このファイルを
    に含める必要があります。 あなたのプロジェクト。
  5. bMyprogram.desktop (ファイル): これは、アプリケーション メニューにアプリケーションを表示するためのファイルです。
  6. setup.py (ファイル): このファイルは、Python プログラムをローカル システムにインストールする役割を果たします。これは、Python プログラムにおいて非常に重要であり、他にも多くの使用方法があります。

もちろんです。プロジェクトに含めることができるファイルやフォルダーは他にもたくさんあります (実際、必要なものは何でも含めることができます) が、これらは基本的なものです。

それでは、プロジェクトのパッケージ化を開始しましょう。 「myprogram 」という新しいフォルダーを作成し、「myprogram 」というファイルを作成し、次のコードを追加します。

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

ui.glade ファイルを作成し、次のコードを入力します。

<?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>

ここまでは何も新しいことはありません。Python ファイルとそのインターフェイス ファイルを作成しただけです。次に、同じフォルダーに「setup.py 」ファイルを作成し、次のコードを追加します。各行はコメントで説明されています。

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. 

次に、同じフォルダーに「myprogram.desktop 」ファイルを作成し、次のコードを追加します。これについてはコメントでも説明されています。

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 

ここでの作業はほぼ完了です。あとは、「dpkg 」のパッケージに関する情報を提供するために、「debian 」フォルダの下にいくつかの小さなファイルを作成するだけです。システム。

debian 」フォルダーを開き、次のファイルを作成します。

control
compat
changelog
rules

コントロール: このファイルには、Debian パッケージに関する基本情報が含まれています。詳細については、「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: これは dpkg システムにとって重要なファイルです。魔法の数字 9 が含まれているだけなので、そのままにしておきます。

9

変更ログ: ここでは、プログラムに加えた変更を追加できます。詳細については、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

ルール: このファイルは、パッケージをインストールするためにローカル マシン上でインストール プロセスを実行する役割を果たします。詳細情報を表示できます。
このファイルについては、「Debian パッケージのデフォルト ルール」を参照してください。

ただし、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:

これでプログラムに必要なファイルがすべて正常に作成できたので、パッケージ化を開始しましょう。まず、開始する前に、ビルド プロセスの依存関係がいくつかインストールされていることを確認してください。

sudo apt-get update
sudo apt-get install devscripts

Debian パッケージとしてパッケージ化するために、「myprogram 」フォルダーがホーム フォルダー (/home/user/myprogram) にあると想定して、次のコマンドを実行します。

cd /home/user/myprogram
debuild -us -uc
サンプル出力
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.

以上です ! Debian パッケージが正常に作成されました。

Debian ベースのディストリビューションにインストールするには、次を実行します。

sudo dpkg -i myprogram_1.0_all.deb

上記のファイルをパッケージの名前に置き換えることを忘れないでください。パッケージをインストールした後、アプリケーション メニューからプログラムを実行できます。

そしてそれはうまくいきます..

ここで、PyGObject に関するシリーズの第 4 回 パートを終了します。次のレッスンでは、PyGObject アプリケーションを簡単にローカライズする方法を説明します。それまでお待ちください…

関連記事: