2013-07-01 10 views
17

Zieldebianzing ein Python-Programm zu erhalten ein .deb

eine installierbare .deb Datei (oder Paket) zu erstellen. Wenn Sie darauf klicken, wird die Software auf einem Linux-Computer installiert und ein Symbol wird auf dem GNOME-Panel angezeigt. Um diese Anwendung von dort zu starten.

Was ich genannt haben

I genannten zwei Debianisieren Führer.

Guide 1

Guide 2

Die erste hatte ein Video, das zu verstehen war unmöglich, zum Teil wegen des Akzents und zum Teil, weil es war hoffnungslos veraltet. (Im Jahr 2007 hochgeladen wurde)

Und der zweite war komplett Text. Ich habe bis zum 4. Schritt, Builds das Paket. Aber als ich es gemacht habe, bekam ich eine Ausgabe, die nicht mit dem übereinstimmt, was in dem Guide angegeben wurde.

Was ich benötige

Ich habe ein einfaches Python-Programm. Es dauert Ihr Alter und druckt dann zurück, wenn das Alter unter, gleich oder über 18 Jahren ist. Es gibt nur eine Datei und keine andere Abhängigkeit für dieses Programm. Und ich möchte das in eine .deb einbauen.

Specs

-Python 2.7

-Linux Mint

bearbeiten

folgte ich die genaue Verzeichnisstruktur, wie Sie, wie Sie angewiesen. Und ersetzt alle mit cowsandbulls. Der Build abgeschlossen und ich habe den Debian. Wenn ich es installiert und lief dann den Befehl cowsandbulls vom Terminal bekam ich folgende Fehlermeldung:

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 

Antwort

21

I stdeb gerade getestet (siehe https://pypi.python.org/pypi/stdeb) ein Python-Paket für anderes Python-Paket in ein Debian-Paket drehen.

Zuerst habe ich installiert stdeb:

apt-get install python-stdeb 

Dann machte ich ein einfaches Skript myscript.py mit folgenden Inhalten genannt:

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

if __name__ == '__main__': 
    main() 

Wichtig ist, dass die Verzeichnisstruktur sein:

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

Im Setup.py-Datei, die Sie tun so etwas wie:

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", 
    ], 
) 

Die console_scripts Richtlinie ist wichtig, es wird ein ausführbares Skript namens my_script, die systemweit verfügbar sein wird, nachdem Sie das resultierende DEB installieren. Wenn Ihr Skript etwa tkinter oder wxpython verwendet und über eine grafische Benutzeroberfläche verfügt, sollten Sie gui_scripts anstelle von console_scripts verwenden.

Die Direktive data_files installiert eine geeignete Desktop-Datei in /usr/share/applications, so dass Sie auch myscript von Ihrer Desktop-Umgebung aus starten können. vxlabs-myscript.desktop sieht wie folgt aus:

[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 

die DEB zu bauen, haben Sie folgende Möglichkeiten in der obersten Ebene myscript:

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

, die eine .deb im deb_dist Verzeichnis erstellen wird.

Nachdem ich die DEB installiert habe, die ich so erstellt habe, konnte ich 10 über die Befehlszeile ausführen, und ich könnte es auch von meiner Desktopumgebung aus aufrufen.

Hier ist ein GitHub Repo mit dem Beispielcode oben: https://github.com/cpbotha/stdeb-minimal-example

+0

Sir: was der Inhalt von '__init sein sollte __ py'.? – IcyFlame

+1

'__init __. Py' ist eine leere Datei, aber Sie müssen sie haben, sonst wird das innerste' myscript'-Verzeichnis nicht als Paket angesehen und kann nicht importiert werden. Der GitHub-Link, den ich am Ende meiner Antwort gepostet habe, enthält den gesamten Code. –

+0

kann ich den Einstiegspunkt auf den Namen einer anderen Funktion ändern? – IcyFlame

1

Der richtige Weg ein deb-Paket zu bauen ist dpkg-buildpackage verwenden, aber manchmal ist es ein wenig kompliziert. Stattdessen können Sie dpkg -b <folder> verwenden und es wird Ihr Debian-Paket erstellen.

Dies sind die Grundlagen für ein Debian-Paket mit dpkg -b <folder> mit jedem binären oder mit jeder Art von Skript erstellen, ohne dass manuelle Zusammenstellung automatisch ausgeführt wird (Python, Bash, Perl, Ruby-):

  1. die Dateien erstellen und Ordner, um die folgende Struktur zu erstellen:
ProgramName-Version/ 
    ProgramName-Version/DEBIAN 
    ProgramName-Version/DEBIAN/control 
    ProgramName-Version/usr/ 
    ProgramName-Version/usr/bin/ 
    ProgramName-Version/usr/bin/your_script 

die Skripte in /usr/bin/ platziert werden direkt vom Terminal genannt, beachten Sie, dass ich nicht eine Erweiterung des scr hinzufügen ipt. Außerdem können Sie feststellen, dass die Struktur des deb-Pakets die Struktur des Programms ist, sobald es installiert ist. Also, wenn Sie diese Logik befolgen, wenn Ihr Programm eine einzige Datei hat, können Sie es direkt unter ProgramName-Version/usr/bin/your_script platzieren, aber wenn Sie mehrere Dateien haben, sollten Sie sie unter ProgramName-Version/usr/share/ProgramName/all your files platzieren und nur eine Datei unter /usr/bin/, die Ihre Skripte von /usr/share/ProgramName/

aufrufen
  1. ändern Sie alle Ordner Erlaubnis root:

    chown root:root -R /path/to/ProgramName-Version 
    
  2. die Berechtigungen des Skript ändern:

    chmod 0755 /path/to/the/script 
    
  3. Schließlich können Sie ausführen: dpkg -b /path/to/the/ProgramName-Version und Ihr Deb-Paket wird erstellt werden!(Sie können auch die post/pre inst Skripte hinzufügen und alles, was Sie wollen, es funktioniert wie ein normales Debian-Paket)


Hier ist ein Beispiel für die control Datei. Sie müssen es nur copy-paste in auf eine leere Datei „Kontrolle“ bezeichnet und in den DEBIAN Ordner setzen

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. 

Wenn Sie dpkg -b <folder> bauen wollen verwenden, können Sie this program verwenden, die alles tun wird, mit ein Befehl. Wenn Sie regelmäßig Pakete erstellen, ist es ein Schmerz, all das zu tun, was ich erwähnt habe!

* wurde die Führung von Basics of Debian Packages genommen