426 Stimmen

Wie schreibt man ein Python-Modul/ein Python-Paket?

Ich habe Python-Skripte für einfache Aufgaben bei der Arbeit geschrieben und habe sie nie wirklich verpackt, damit andere sie verwenden können. Jetzt wurde mir zugewiesen, einen Python-Wrapper für eine REST-API zu erstellen. Ich habe absolut keine Ahnung, wie ich anfangen soll und brauche Hilfe.

Was ich habe:

(Möchte so spezifisch wie möglich sein) Ich habe das virtualenv bereit, es ist auch auf github verfügbar, die .gitignore-Datei für Python ist ebenfalls vorhanden, sowie die requests-Bibliothek zum Interagieren mit der REST-API. Das ist es.

Hier ist der aktuelle Verzeichnisbaum

.
 bin
   /die üblichen Sachen/
 include
   /die üblichen Sachen/
 lib
   python2.7
       /die üblichen Sachen/
 local
   /die üblichen Sachen/
 README.md

27 Verzeichnisse, 280 Dateien

Ich weiß nicht einmal, wohin ich die .py-Dateien legen soll, wenn ich jemals welche erstelle.

Was ich tun wollte:

Eine Python-Modul erstellen, das mit "pip install ..." installiert werden kann.

Wenn möglich, möchte ich eine allgemeine Schritt-für-Schritt-Anleitung zum Schreiben von Python-Modulen.

459voto

Anuj Punkte 8922

Ein Modul ist eine Datei, die Python-Definitionen und Anweisungen enthält. Der Dateiname ist der Modulname mit der Endung .py

Erstelle hello.py und schreibe dann die folgende Funktion als Inhalt:

def helloworld():
   print "hello"

Dann kannst du hello importieren:

>>> import hello
>>> hello.helloworld()
'hello'
>>>

Um viele .py Dateien zu gruppieren, lege sie in einen Ordner. Jeder Ordner mit einer __init__.py wird von Python als Modul betrachtet und du kannst sie als Paket bezeichnen

|-HelloModule
  |_ __init__.py
  |_ hellomodule.py

Du kannst das Import-Statement für dein Modul auf die übliche Weise verwenden.

Weitere Informationen findest du unter 6.4. Packages.

267voto

arcseldon Punkte 32403

Python 3 - AKTUALISIERT am 18. November 2015

Ich fand die akzeptierte Antwort nützlich, wollte aber auf mehrere Punkte aufbauen, die für andere basierend auf meinen eigenen Erfahrungen von Vorteil sein könnten.

Modul: Ein Modul ist eine Datei, die Python-Definitionen und -Anweisungen enthält. Der Dateiname ist der Modulname mit dem angehängten Suffix .py.

Beispiel für ein Modul: Angenommen, wir haben ein einzelnes Python-Skript im aktuellen Verzeichnis, hier nenne ich es mymodule.py

Die Datei mymodule.py enthält den folgenden Code:

def myfunc():
    print("Hallo!")

Wenn wir den Python3-Interpreter aus dem aktuellen Verzeichnis ausführen, können wir die Funktion myfunc auf verschiedene Arten importieren und ausführen (normalerweise wählen Sie einfach eine der folgenden Optionen):

>>> import mymodule
>>> mymodule.myfunc()
Hallo!
>>> from mymodule import myfunc
>>> myfunc()
Hallo!
>>> from mymodule import *
>>> myfunc()
Hallo!

Okay, das war einfach genug.

Angenommen, Sie haben jetzt die Notwendigkeit, dieses Modul in einen eigenen dedizierten Ordner zu legen, um einen Modulnamensraum bereitzustellen, anstatt es nur ad-hoc aus dem aktuellen Arbeitsverzeichnis auszuführen. Hier ist es sinnvoll, das Konzept eines Pakets zu erklären.

Paket: Pakete sind eine Möglichkeit, den Modulnamensraum von Python über "gepunktete Modulnamen" zu strukturieren. Zum Beispiel bezeichnet der Modulname A.B ein Untermodul namens B in einem Paket namens A. Genau wie die Verwendung von Modulen die Autoren verschiedener Module davor bewahrt, sich um die globalen Variablennamen der anderen kümmern zu müssen, spart die Verwendung von punktierten Modulnamen den Autoren von Mehr-Modul-Paketen wie NumPy oder der Python Imaging Library die Sorge um die Modulnamen der anderen.

Beispiel für ein Paket: Nehmen wir jetzt an, wir haben den folgenden Ordner und die folgenden Dateien. Hier ist mymodule.py identisch mit zuvor, und __init__.py ist eine leere Datei:

.
 mypackage
     __init__.py
     mymodule.py

Die __init__.py-Dateien sind erforderlich, damit Python die Verzeichnisse als Pakete behandelt. Weitere Informationen finden Sie im später bereitgestellten Link zur Modulsdokumentation.

Unser aktuelles Arbeitsverzeichnis liegt eine Ebene über dem Ordner namens mypackage

$ ls
mypackage

Wenn wir jetzt den Python3-Interpreter ausführen, können wir das Modul mymodule.py mit der erforderlichen Funktion myfunc auf verschiedene Arten importieren und ausführen (normalerweise wählen Sie einfach eine der folgenden Optionen):

>>> import mypackage
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hallo!
>>> import mypackage.mymodule
>>> mypackage.mymodule.myfunc()
Hallo!
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hallo!
>>> from mypackage.mymodule import myfunc
>>> myfunc()
Hallo!
>>> from mypackage.mymodule import *
>>> myfunc()
Hallo!

Unter der Annahme von Python 3 gibt es ausgezeichnete Dokumentation unter: Module

In Bezug auf Namenskonventionen für Pakete und Module lauten die allgemeinen Richtlinien in PEP-0008 - bitte sehen Sie Paket- und Modulnamen

Module sollten kurze, alles in Kleinbuchstaben geschriebene Namen haben. Unterstriche können im Modulnamen verwendet werden, wenn sie die Lesbarkeit verbessern. Python-Pakete sollten ebenfalls kurze, alles in Kleinbuchstaben geschriebene Namen haben, obwohl die Verwendung von Unterstrichen nicht empfohlen wird.

230voto

bgse Punkte 7924

Da bisher niemand diese Frage des OP beantwortet hat:

Was ich tun wollte:

Ein Python-Modul installierbar machen mit "pip install ..."

Hier ist ein absolut minimales Beispiel, das die grundlegenden Schritte zum Vorbereiten und Hochladen Ihres Pakets auf PyPI mit setuptools und twine zeigt.

Dies ersetzt keineswegs das Lesen des Tutorials, es gibt viel mehr als in diesem sehr grundlegenden Beispiel behandelt.

Das Erstellen des Pakets selbst wurde bereits von anderen Antworten hier behandelt, daher nehmen wir an, dass wir diesen Schritt abgedeckt haben und unsere Projektstruktur wie folgt aussieht:

.
 hellostackoverflow/
     __init__.py
     hellostackoverflow.py

Um setuptools für das Verpacken zu verwenden, müssen wir eine Datei setup.py hinzufügen, dies kommt in den Root-Ordner unseres Projekts:

.
 setup.py
 hellostackoverflow/
     __init__.py
     hellostackoverflow.py

Mindestens geben wir die Metadaten für unser Paket an, unser setup.py würde so aussehen:

from setuptools import setup

setup(
    name='hellostackoverflow',
    version='0.0.1',
    description='ein Beispiel für ein mit pip installierbares Paket',
    license='MIT',
    packages=['hellostackoverflow'],
    author='Benjamin Gerfelder',
    author_email='benjamin.gerfelder@gmail.com',
    keywords=['example'],
    url='https://github.com/bgse/hellostackoverflow'
)

Da wir license='MIT' festgelegt haben, fügen wir eine Kopie in unserem Projekt als LICENCE.txt hinzu, zusammen mit einer Readme-Datei in reStructuredText als README.rst:

.
 LICENCE.txt
 README.rst
 setup.py
 hellostackoverflow/
     __init__.py
     hellostackoverflow.py

An diesem Punkt sind wir bereit, mit dem Verpacken mit setuptools zu beginnen. Wenn wir es noch nicht installiert haben, können wir es mit pip installieren:

pip install setuptools

Um dies zu tun und eine source distribution zu erstellen, rufen wir in unserem Projekt-Root-Ordner unser setup.py über die Befehlszeile auf und geben an, dass wir sdist möchten:

python setup.py sdist

Dadurch wird unser Verteilungspaket und Egg-Info erstellt und führt zu einer Ordnerstruktur wie dieser, mit unserem Paket in dist:

.
 dist/
 hellostackoverflow.egg-info/
 LICENCE.txt
 README.rst
 setup.py
 hellostackoverflow/
     __init__.py
     hellostackoverflow.py

An diesem Punkt haben wir ein Paket, das wir mit pip installieren können, also sie aus unserem Projekt-Root (unter der Annahme, dass Sie alle Bezeichnungen wie in diesem Beispiel haben):

pip install ./dist/hellostackoverflow-0.0.1.tar.gz

Wenn alles gut geht, können wir jetzt einen Python-Interpreter öffnen, ich würde sagen, irgendwo außerhalb unseres Projektverzeichnisses, um Verwirrung zu vermeiden, und versuchen, unser neues Paket zu verwenden:

Python 3.5.2 (default, Sep 14 2017, 22:51:06) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from hellostackoverflow import hellostackoverflow
>>> hellostackoverflow.greeting()
'Hello Stack Overflow!'

Jetzt, da wir bestätigt haben, dass das Paket installiert und funktioniert, können wir es auf PyPI hochladen.

Da wir das Live-Repository nicht mit unseren Experimenten verunreinigen wollen, erstellen wir ein Konto für das Test-Repository und installieren twine für den Upload-Prozess:

pip install twine

Jetzt sind wir fast fertig, mit unserem erstellten Konto sagen wir twine einfach, dass wir unser Paket hochladen möchten. Es wird nach unseren Anmeldedaten fragen und unser Paket im angegebenen Repository hochladen:

twine upload --repository-url https://test.pypi.org/legacy/ dist/*

Jetzt können wir uns in unser Konto im PyPI-Test-Repository einloggen und für eine Weile unser frisch hochgeladenes Paket bestaunen und es dann mit pip herunterladen:

pip install --index-url https://test.pypi.org/simple/ hellostackoverflow

Wie wir sehen können, ist der grundlegende Prozess nicht sehr kompliziert. Wie bereits erwähnt, gibt es viel mehr als hier behandelt, also gehen Sie vor und lesen Sie das Tutorial für eine ausführlichere Erklärung.

8voto

Dreamatronix Punkte 97

Sobald Sie Ihre ausgewählten Befehle definiert haben, können Sie die gespeicherte Datei einfach in den Lib-Ordner Ihrer Python-Programmdateien ziehen und ablegen.

>>> import mymodule 
>>> mymodule.myfunc()

2voto

Kakkoiikun Punkte 41

Erstelle eine Datei mit dem Namen "hello.py"

Wenn Sie Python 2.x verwenden

def func():
    print "Hallo"

Wenn Sie Python 3.x verwenden

def func():
    print("Hallo")

Führen Sie die Datei aus. Anschließend können Sie Folgendes ausprobieren:

>>> import hello
>>> hello.func()
Hallo

Wenn Sie es etwas schwieriger gestalten möchten, können Sie Folgendes verwenden:

Wenn Sie Python 2.x verwenden

def say(text):
    print text

Wenn Sie Python 3.x verwenden

def say(text):
    print(text)

Sehen Sie das in Klammern neben dem "def"? Das ist wichtig. Das ist das, was Sie innerhalb des "def" verwenden können.

Text - Sie können es verwenden, wenn Sie möchten, dass das Programm sagt, was Sie wollen. Entsprechend seinem Namen handelt es sich um Text. Ich hoffe, Sie wissen, was Text bedeutet. Es bedeutet "Wörter" oder "Sätze".

Führen Sie die Datei aus. Anschließend können Sie Folgendes ausprobieren, wenn Sie Python 3.x verwenden:

>>> import hello
>>> hello.say("hallo")
hallo
>>> from hello import say
>>> say("test")
test

Für Python 2.x - ich denke, dasselbe gilt für Python 3? Keine Ahnung. Korrigieren Sie mich, wenn ich einen Fehler bei Python 2.x gemacht habe (Ich kenne Python 2, aber ich bin mit Python 3 vertraut)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X