2016-07-15 19 views
3

Ich habe gerade ein Modul fertiggestellt und möchte es packen. Ich habe die Dokumentation und diese Frage packaging a python application gelesen, aber ich bin mir nicht sicher, wie ich vorgehen soll, wenn ich kein zu importierendes Paket, sondern ein Skript zum Starten habe.Verpacken einer Python-Bibliothek mit einer ausführbaren Datei

Das Projekt sieht wie folgt aus:

Project/ 
|-- README 
|-- requirement.txt 
|-- driver.py 
|-- run.py 
|-- module_1 
| |-- __init__.py 
| |-- class_1.py 
| |-- class_2.py 
|-- module 2 
|-- |-- __init__.py 
|-- |-- class_1.py 
|-- |-- class_2.py 

Um das Werkzeug, das ich tun, um zu starten:

python run.py arg1 --option arg2 

driver.py importiert alle anderen Module und definiert eine Driver Klasse und einige Funktionen. run.py importiert driver.py, analysiert Argumente, richtet den Logger ein und ruft die Funktion nacheinander auf, um den Job zu erledigen.

Ich bin mir nicht sicher über die Konfiguration von setup.py, brauche ich auch eine globale __init__.py an der Wurzel? Von dem, was ich verstanden habe, werde ich nur import Project tun können, um das Skript run.py mit seinen Argumenten nicht zu starten.

Aus anderen Lesungen, vielleicht sollte ich versuchen, die entry_points Möglichkeit setup() zu sagen, dass Driver.py das Paket und zu verwenden. Aber ich verstehe nicht, wie ich alles richtig machen soll.

Vielen Dank für Ihre freundliche Hilfe!

Antwort

1

Im Allgemeinen verteilen Sie Python-Pakete nur als Module, wenn das gesamte Projekt in eine einzelne Moduldatei passt. Wenn Ihr Projekt komplexer ist, ist es normalerweise am besten, Ihr Projekt als Paket mit einer __init__.py Datei zu strukturieren. Hier ist, was Ihr Projekt wie umgewandelt in ein Paket aussehen würde

Project/ 
|-- README 
|-- requirement.txt 
|-- setup.py 
|-- scripts/ 
| |-- driver.py 
|-- driver/ 
| |-- __init__.py 
| |-- module_1 
| | |-- __init__.py 
| | |-- class_1.py 
| | |-- class_2.py 
| |-- module_2 
| |-- |-- __init__.py 
| |-- |-- class_1.py 
| |-- |-- class_2.py 

I umbenannt Ihre run.py zu scripts/driver.py und der Code, den Sie zuvor in driver.py haben, ist jetzt driver/__init__.py.

Ihre setup.py wie diese Dieses

from setuptools import setup. find_packages 

setup(
    name='driver', 
    version='1.0', 
    packages=find_packages(), 
    scripts=['scripts/driver.py'], 
) 

aussehen sollte, wird scripts/driver.py auf die Python Scripts-Verzeichnis kopieren. Ich habe run.py in driver.py umbenannt, da run ziemlich generisch ist und Sie wollen, dass Ihre Skriptnamen eindeutig sind, da alle Python-Pakete den gleichen Speicherort für Skripte haben. Alternativ können Sie auch den console_scripts Einstiegspunkt verwenden. In diesem Fall hätten Sie kein separates scripts/driver.py Skript. Stattdessen haben Sie nur eine Funktion in Ihrem Paket. In diesem Fall können Sie den gesamten Code von scripts/driver.py in driver/command_line.py verschieben und in eine Funktion namens main() einfügen. Dann ändern Sie Ihre setup.py dieser

setup(
    name='driver', 
    version='1.0', 
    packages=find_packages(), 
    entry_points = { 
     'console_scripts': ['driver=driver.command_line:main'], 
    } 
) 

Außerdem sollten Sie this docs page on python packaging lesen. Es behandelt die Grundlagen und viele der üblichen Anwendungsfälle.

+0

Danke @Abel, das ist mir jetzt klar! Werde dies bei der Arbeit Montag versuchen! Gibt es einen Vorteil, eine Lösung gegenüber der anderen zu verwenden? Der erste scheint klarer zu sein, denke ich. – Y0da