Seite 1 von 1
Packaging my_program.py (mit den anderen Dateien in Verbindung bringen?)
Verfasst: Donnerstag 15. April 2021, 15:11
von GabrielleChanel
Ich habe ein "einfaches" (d.h. nur minimum Angaben)
Packaging Python Projekt mit diesem Tutorial
https://packaging.python.org/tutorials/ ... -projects/ erstellt.
Folgendermassen sieht mein Package aus (die Dateien sind mit Inhalt gefüllt und funktionstüchtig):
packaging_tutorial/
├── LICENSE
├── pyproject.toml
├── README.md
├── setup.cfg
├── setup.py (optional, Inhalt kann hier noch ergänzt werden)
├── src/
│ └── example_pkg/
│ └── __init__.py
└── tests/
Nun möchte ich
mein Programm "my_program.py" in dieses packaging miteinbeziehen. Ich nehme an, dass ich es auch in diesem Ordner einfügen muss? Aber wie bzw. wo rufe ich es genau auf bwz. wie inkuldiere ich es in meinem "Packaging"? Also
wie ist "my_program.py" mit den anderen Dateien verbunden?
Ich habe folgende Information gefunden, um dieses Problem zu lösen, weiss aber noch nicht wie ich dies genau umsetzen kann/muss:
-> Ein "entry point" im main() meines "my_program.py" erstellen. Und dies kann ich in dem ich ein "console script" in meinem "setup.py" speichere erreichen. Aber ich verstehe nicht wirklich wie ich dies in die Praxis umstellen kann. Kann mir bitte jemand weiterhelfen?
Ziel ist danach
mit "pip install" auf mein Package zugreifen zu können.
Re: Packaging my_program.py (mit den anderen Dateien in Verbindung bringen?)
Verfasst: Donnerstag 15. April 2021, 15:25
von __blackjack__
@GabrielleChanel: Mit Inhalt gefüllt heisst hoffentlich auch das `example_pkg` nicht `example_pkg` heisst, denn das ist ein ziemlich schlechter Name.
Dein `my_program.py` sollte es eigentlich nicht geben, das sollte in dem Package sein oder das Package selbst sein. Und ein ausführbares Programm wird dann daraus beim installieren erstellt wenn man den entsprechenden `entry_point` angibt. Also beispielsweise "my_program:example_pkg:main", falls dein Package tatsächlich diesen sehr ungünstigen Namen hat und in dessen `__init__()` eine `main()`-Funktion existiert die das Programm ausführt.
Re: Packaging my_program.py (mit den anderen Dateien in Verbindung bringen?)
Verfasst: Donnerstag 15. April 2021, 15:44
von GabrielleChanel
Danke für deine Ausführungen. Das ist hier nur ein Beispiel, deswegen heissen die Dateien noch "example_pkg", "my_program.py" usw.
Ich komme aber noch nicht ganz draus. Nehmen wir als Beispiel an "my_program.py" enthält das Miniprogramm: print("hello world") und ich möchte, dass dieses "gepackaged" wird. Wo ergänze ich nun in meinem Ordner ("packaging_tutorial") das Miniprogramm "my_program.py"?
packaging_tutorial/
├── LICENSE
├── pyproject.toml
├── README.md
├── setup.cfg
├── setup.py (optional, Inhalt kann hier noch ergänzt werden)
├── my_program.py #Hier? (Option A)
├── src/
│ └── example_pkg/
│ └── __init__.py
│ └── my_program_.py #oder hier? (Option B)
└── tests/
Oder woanderst (Option C)? Wenn ja, wo genau?
Und wie bringe ich es mit den Anderen in Verbindung? Wird das automatisch ausgeführt oder etwa im main() des __init__.py?
Re: Packaging my_program.py (mit den anderen Dateien in Verbindung bringen?)
Verfasst: Donnerstag 15. April 2021, 17:21
von __blackjack__
@GabrielleChanel: Weder A noch B. Falls die `__init__.py` leer ist, dann könnte der Inhalt beispielsweise dort hinein. Wobei ich mich in dem Fall aber auch fragen würde was das hier überhaupt alles soll, denn dann hättest Du gar kein Package und damit wäre das auch nix für den Package Index.
Wobei mir auch gerade auffällt, dass die `__init__.py` im falschen Verzeichnis liegt. Die ”macht” das Package und das ist ja nicht `src` sondern `example_pkg`.
Re: Packaging my_program.py (mit den anderen Dateien in Verbindung bringen?)
Verfasst: Freitag 16. April 2021, 08:23
von GabrielleChanel
Also ich wollte zuerst das ganze Packaging ohne meine Programme ausführen. Nun möchte ich diese aber integrieren. Ich habe zwei Programme ein "my_program.py" und ein "cli.py". Das zweite Programm hilft dem User durch eine "intuitivere" Darstellung mit Flags und Hilfestellungen bei der Eingabe des Inputs (Dank der Verwendung von argparse). "cli.py" ermöglicht ein erleichterten Zugang auf das "my_program.py" Programm. Nun möchte ich aus meinen beiden miteinander verbundenen Programmen ein Package Projekt machen. Aus diesem Grund habe ich das vorherig erwähnte Tutorial befolgt und alle für ein Packaging dazugehörenden notwendige Dateien erstellt (Lizenz, README.md, usw.).
Nun fehlt mir nur noch den Schritt alles miteinander in Verbindung zu setzen.
- Wie und an welcher Stelle genau integriere ich "my_program.py" und "cli.py" in meinem Package (In welcher Ordnerstruktur)?
- Sowie was (welchen Code) muss ich wo und wie abändern/hinzufügen?
Damit ich nach den Aktivierungsschritten nur noch "pip install name_of_my_package" (der Name steht in der setup.cfg Datei unter: "name = name_of_my_package") machen muss, um dann direkt auf mein Package aktiv zugreifen zu können?
Laut Tutorial steht die __init__.py im richtigen Verzeichnis. 'example_pkg' ist ja in source und darin die init. Würdest du diese denn woanderst verschieben?
Re: Packaging my_program.py (mit den anderen Dateien in Verbindung bringen?)
Verfasst: Freitag 16. April 2021, 14:38
von __blackjack__
@GabrielleChanel: Du hast im Grunde nicht alle notwendigen Dateien erstellt. Du hast da kein sinnvolles Package. Also ein Package aus Python-Sicht, das dann in ein PyPI-Package gepackt wird. Der bevorzugte Weg ist es überhaupt gar keine Programme zu haben, sondern ein Package zu schreiben. Und dann kann man via Entry-Points beim installieren Programme erstellen lassen, die dann diese Entry-Points in dem Package aufrufen.
Deine `__init__.py` ist im falschen Verzeichnis falsch. Tutorial sagt:
├── src/
│ └── example_pkg/
│ └── __init__.py
Du schreibst hier aber es würde bei Dir so aussehen:
├── src/
│ └── example_pkg/
│ └── __init__.py
`example_pkg` ist das Package wenn die `__init__.py` *in* diesem Verzeichnis liegt, nicht wenn sie im `src`-Verzeichnis liegt. `example_pkg` sollte wie gesagt nicht diesen Namen haben, sondern einen sinnvollen. Also beispielsweise `my_program`. Denn das ist das was am Ende installiert wird, und das kann/darf offensichtlich nicht `example_pkg` heissen, sondern muss ein was Python-Packages angeht eindeutigen, sinnvollen Namen haben, der nicht mit anderen installierten Packages kollidieren kann. In der Regel sollte das den gleichen Namen haben wie das PyPI-Package was Du daraus dann machst. Alles andere verwirrt die Leute am Ende nur.
Falls Dein jetziges `my_program`-Modul nichts aus dem `cli`-Modul braucht, kann man den Inhalt von `my_program.py` in die `__init__.py` kopieren. Und das `cli`-Modul als Untermodul in das `my_program`-Package stecken. Falls das Hauptprogramm als Modul per Python's ``-m``-Option ausführbar sein soll, müsste man noch eine `__main__.py` anlegen. Und dann kannst Du zwei Entry-Points anlegen aus denen dann beim Installieren Programme generiert werden. Die Dokumentation von setuptools hat da ja auch ein Beispiel für.