Ein einfaches Hallo World Setuptools Paket und installieren es mit Pip

Ich habe Schwierigkeiten herauszufinden, wie ich mein Paket mit setuptools installieren kann, und ich habe versucht, die Dokumentation darüber zu lesen und SO Beiträge, aber ich kann es nicht richtig funktionieren. Ich versuche, eine einfache Helloworld-Anwendung zu bekommen, um zu arbeiten. So weit bekam ich:

Helloworld.py:

print("Hello, World!") 

README.txt:

 Hello, World! readme 

MANIFEST.in:

 recursive-include images *.gif 

Setup.py:

 from setuptools import setup, find_packages setup( name='helloworld', version='0.1', license='BSD', author='gyeh', author_email='hello@world.com', url='http://www.hello.com', long_description="README.txt", packages=find_packages(), scripts = ['helloworld.py'], package_data={ "" : ["images/*.gif"] }, data_files=[('images', ['images/hello.gif'])], description="Hello World testing setuptools", ) 

Und ich habe eine leere Datei namens images / hello.gif, die ich in mein Paket als zusätzliche Daten aufnehmen möchte. Die Ordnerstruktur sieht so aus:

 testsetup/ |-- helloworld.py |-- images/ |-- --- hello.gif |-- MANIFEST.in |-- README.txt |-- setup.py 

Wenn ich python setup.py sdist , erzeugt es die dist und helloworld.egg-info erfolgreich. Wenn ich auf SOURCES.txt unter Ei-Info schaue, enthält es das Skript und das Bild unter dem Bilder-Ordner, und das Tarball unter dist enthält sie auch.

Allerdings, wenn ich versuche, pip install --user helloworld-0.1.tar.gz auf dem Tarball, es erfolgreich installiert es, aber ich kann nicht finden, die Programmdateien helloworld.py und images / hallo.gif.

Wenn ich unter $HOME/.local/lib/python3.3/site-packages/ , sehe ich den Ei-Info-Ordner und all dessen Inhalt ist dort installiert. Aber der Ordner $HOME/.local/bin noch nicht vorhanden. Sind die Programmdateien woanders speichert? Was mache ich hier falsch? Ich laufe Arch Linux.

One Solution collect form web for “Ein einfaches Hallo World Setuptools Paket und installieren es mit Pip”

Okay, also nach einer gewissen Anstrengung habe ich es endlich geschafft, ein einfaches "hallo welt" zu bekommen, das für setuptools arbeitet. Die Python-Dokumentation ist in der Regel erstaunlich, aber ich wünschte, die Dokumentation war besser hierzu besonders.

Ich werde einen ziemlich ausführlichen Leitfaden schreiben, wie ich das erreicht habe, und ich werde keinen vorherigen Hintergrund auf den Leser zu diesem Thema übernehmen. Ich hoffe, das kommt für andere …

Um dieses Beispiel einzurichten, erstellen wir ein Paket (eigentlich zwei davon, eins für die Datendateien). Dies ist die Verzeichnisstruktur, die wir am Ende haben:

 test-setuptools/ |-- helloworld/ |-- --- hello.py |-- --- images/ |-- --- --- hello.gif |-- --- --- __init__.py |-- --- __init__.py |-- MANIFEST.in |-- README.txt |-- setup.py 

Hier sind die Schritte:

  1. Erstellen Sie das helloworld Paket.
    1.1 Erstellen Sie den helloworld/ Ordner, wie in der oben beschriebenen Verzeichnisstruktur gezeigt.

    1.2 __init__.py eine leere Datei mit dem Namen __init__.py im helloworld/ Ordner hinzu.
    Wenn Sie es nicht hinzufügen, wird das Paket nicht erkannt (run touch __init__.py , um die Datei auf Linux / Mac-Maschinen zu erstellen). Wenn Sie möchten, dass ein Code jedes Mal ausgeführt wird, wenn das Paket importiert wird, __init__.py es in die Datei __init__.py .

    1.3 Erstellen Sie die hello.py , um die hello.py zu demonstrieren.

Hier ist der Code für hello.py :

 import os """ Open additional data files using the absolute path, otherwise it doesn't always find the file. """ # The absolute path of the directoy for this file: _ROOT = os.path.abspath(os.path.dirname(__file__)) class Hello(object): def say_hello(self): return "Hello, World!" def open_image(self): print("Reading image.gif contents:") # Get the absolute path of the image's relative path: absolute_image_path = os.path.join(_ROOT, 'images/hello.gif') with open(absolute_image_path, "r") as f: for line in f: print(line) 
  1. 1.4 Erstellen Sie die images/ Ordner innerhalb der helloworld/ Ordner.
    Machen Sie eine weitere leere Datei __init__.py , da dieser Ordner auch ein Paket ist.

    1.5 Erstellen Sie die Datei hello.gif in den images/ Ordner.
    Diese Datei ist keine gültige GIF-Datei. Stattdessen fügen Sie einfach Text, um nur zu zeigen, dass Nicht-Skript-Dateien hinzugefügt und gelesen werden können.

Ich habe den folgenden Code in hello.gif :

 This should be the data inside hello.gif... ...but this is just to demonstrate setuptools, so it's a dummy gif containing plain text 
  1. 1.6 Testen Sie Ihr Paket
    Führen Sie python aus dem test-setuptools Ordner, der den Python-Interpreter öffnen wird.
    import helloworld.hello , um das hello.py Skript im helloworld Paket zu importieren. Der Import sollte erfolgreich sein, was darauf hinweist, dass Sie ein Paket erfolgreich erstellt haben. import helloworld.images Sie sicher, dass das Paket in den images/ Ordner auch funktioniert, indem Sie import helloworld.images
    Versuchen Sie, das Objekt zu instanziieren, das wir in hello.py . Geben Sie die folgenden Befehle ein, um sicherzustellen, dass alles wie erwartet funktioniert:
    hey = helloworld.hello.Hello()
    hey.say_hello()
    hey.open_image()

  2. Erstellen Sie die Datei setup.py und die restlichen Dateien.
    2.1 Erstellen Sie eine einfache README.txt Datei. Meiner hat nur den Text: Hello, World! Readme Hello, World! Readme Inneren.

    2.2 Erstellen Sie eine Datei MANIFEST.in mit folgendem Inhalt:
    include helloworld/images/hello.gif
    .
    Das ist sehr wichtig, weil es Setupuptools mitteilt, dass er die zusätzlichen Daten in die Quellverteilung aufnimmt (die wir später erzeugen werden). Ohne diese werden Sie nicht in der Lage sein, zusätzliche, nicht .py Daten zu Ihrem Paket zu installieren. Weitere Informationen und Befehle finden Sie hier.

    2.3 Erstellen Sie die Datei setup.py (siehe Code unten).
    Die wichtigsten Attribute sind packages , include_package_data und package_data .
    .
    Das Paketattribut enthält eine Liste der Pakete, die Sie für setuptools enthalten möchten. Wir wollen sowohl das helloworld Paket als auch das helloworld.images Paket mit unseren Zusatzdaten hello.gif .
    Sie können Setup-Tools automatisch finden, indem Sie die from setuptools import find_packages importieren und die importierte find_packages() -Funktion find_packages() . Führen Sie den Dolmetscher aus dem Ordner test-setuptools und testen Sie diesen Befehl, um zu sehen, welche Pakete gefunden werden.
    .
    Das package_data teilt setuptools mit zusätzlichen Daten mit. Es ist dieser Befehl, das helloworld.images Paket und die MANIFEST.in Datei, die Ihnen erlaubt, zusätzliche Daten zu installieren.
    Die 'helloworld.images' : ['hello.gif'] Schlüssel / Wert-Paar sagt Setup-Werkzeuge, um hello.gif in das helloworld.images Paket helloworld.images , falls es existiert. Sie können auch '' : ['*.gif'] , um jede. GIF-Datei in einem der enthaltenen Pakete enthalten.
    Das Attribut include_package_data , das auf True gesetzt ist, ist auch notwendig, damit dies funktioniert.
    Sie können zusätzliche Metadaten für das Paket wie ich haben (ich glaube, ein author ist notwendig). Es ist eine gute Idee, Klassifikatoren hinzuzufügen. Weitere Infos finden Sie hier .

Hier ist der ganze setup.py Code:

 from setuptools import setup setup( name='helloworld', version='0.1', license='BSD', author='gyeh', author_email='hello@world.com', url='http://www.hello.com', long_description="README.txt", packages=['helloworld', 'helloworld.images'], include_package_data=True, package_data={'helloworld.images' : ['hello.gif']}, description="Hello World testing setuptools", ) 

.
3. Installieren und testen Sie Ihr Paket mit Setuptools.

 3.1 Create the source distribution 

Führen Sie python setup.py sdist aus dem test-setuptools/ , um die Quellverteilung zu generieren.
Dies wird einen dist/ Ordner mit Ihrem Paket und ein helloworld.egg-info/ Ordner mit Metadaten wie SOURCE.txt .
Überprüfen Sie SOURCE.txt zu sehen, ob Ihre hello.gif Bilddatei dort enthalten ist.
Öffnen Sie die .tar.gz Datei unter dem dist/ folder. Sie sollten alle Dateien sehen, die in der Verzeichnisstruktur beschrieben wurden, die wir früher gemacht haben, einschließlich hello.gif und hello.py .

 3.2 Install the distribution 

Installieren Sie die .tar.gz-Verteilungsdatei, indem Sie die pip install --user helloworld-0.1.tar.gz aus dem dist/ pip install --user helloworld-0.1.tar.gz .
Prüfen Sie, ob das Paket erfolgreich installiert wurde. Das Paket helloworld sollte dort sein.

Das ist es! Jetzt sollten Sie in der Lage sein, Ihr Paket unter jedem Ordner zu testen. Öffnen Sie den Dolmetscher in einem beliebigen Ordner außer test-setuptools und versuchen Sie, das Paket mit import helloworld.hello . Es sollte funktionieren. Dann versuchen Sie die Befehle, um das Objekt zu instanziieren und öffnen Sie die Bilddatei mit dem Befehl hey.open_image() erneut. Es sollte noch funktionieren!

Sie können genau sehen, welche Dateien per Pip installiert wurden und wo sie sind, indem Sie das Paket deinstallieren. Meins sah so aus:

 [gyeh@gyeh package]$ pip uninstall helloworld Uninstalling helloworld: /home/gyeh/.local/lib/python3.3/site-packages/helloworld-0.1-py3.3.egg-info /home/gyeh/.local/lib/python3.3/site-packages/helloworld/__init__.py /home/gyeh/.local/lib/python3.3/site-packages/helloworld/__pycache__/__init__.cpython-33.pyc /home/gyeh/.local/lib/python3.3/site-packages/helloworld/__pycache__/hello.cpython-33.pyc /home/gyeh/.local/lib/python3.3/site-packages/helloworld/hello.py /home/gyeh/.local/lib/python3.3/site-packages/helloworld/images/__init__.py /home/gyeh/.local/lib/python3.3/site-packages/helloworld/images/__pycache__/__init__.cpython-33.pyc /home/gyeh/.local/lib/python3.3/site-packages/helloworld/images/hello.gif Proceed (y/n)? y Successfully uninstalled helloworld 

Wie Sie sehen können, hat es erfolgreich die zusätzliche hello.gif installiert und weil wir den relativen Pfad zu einem absoluten Pfad in hello.py , kann er die Datei gut ablesen.
Sie können dann dieses Paket auf PyPI für den Rest der Welt zu verwenden! Die Anweisungen zum Hochladen auf PyPI sind ziemlich einfach und finden Sie hier und hier .

Sobald es online in PyPI ist, können die Leute nach Ihrem Paket mit pip search . Oder alternativ, laufende pip install --user [package-name] wird Pip, um das Online-PyPI-Verzeichnis für diesen Paketnamen zu durchsuchen. Wenn es existiert, wird es es installieren.

Sie können diesen Befehl für jedes Python-Paket, das in PyPI für eine einfache Installation, so dass Sie nicht mucking mit Build-Dateien laufen.

Ich hoffe das spart den Menschen ein paar Kopfschmerzen.

  • So deaktivieren Sie das Hochladen eines Pakets auf PyPi, es sei denn - public wird an den Upload-Befehl übergeben
  • Verwenden von easy_install in einem Python-Skript?
  • Wie kann ich setuptools verwenden, um einen console_scripts Einstiegspunkt zu erzeugen, der `python -m mypackage` aufruft?
  • Wie man Flaggen zu einer distutils Erweiterung passiert?
  • Python setuptools: wie man eine Konfigurationsdatei für die Verteilung in <prefix> / etc einfügt
  • Python "setup.py entwickeln": Ist es möglich, ".egg-info" Ordner nicht im Quellcode-Ordner zu erstellen?
  • Warum macht die Installation eines Python-Pakets Pausen-Setups und verursacht pkg_resources nicht gefunden werden?
  • Passt papier extras_requires von setuptools / verteilte basierte Quellen?
  • Nicht setup.py entwickeln Gebrauchsrad für install_requires?
  • Kann ich setuptools ohne berechtigungen zu / usr / local etc benutzen
  • Python - Paket, das mit easy_install installiert ist, wird nicht erkannt (PIL 1.1.7)
  • Python ist die beste Programmiersprache der Welt.