Eigene private Library erstellen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
zegru
User
Beiträge: 66
Registriert: Freitag 9. Oktober 2020, 09:22

Hallo!

Ich habe 2 Projekte, von denen eines das andere einbindet. Also kurz so:

Code: Alles auswählen

devel
---+ Vaterprojekt
            blubber.py
            venv/
---+ library_projekt
            lib/
                 nuetzlich.py
            venv/
Ich möchte nun von Vaterprojekt/blubber.py aus auf library_projekt/lib/nuetzlich.py zugreifen.
Im Moment habe ich das so gemacht, dass ich in Vaterprojekt/blubber.py folgenden Code habe:

Code: Alles auswählen

import logging
import sys
sys.path.append(os.path.abspath('../library_projekt'))
import lib.nuetzlich
Das ist aber unschön und macht unterwegs so allerlei Probleme.
Ich könnte zwar library_projekt in pypi veröffentlichen, so dass es jeder einbinden und in requirements.txt auflisten kann. Also natürlich auch ich, aber das will ich nicht.
Gibt es auch die Möglichkeit, diese eigene nicht-öffentliche Library so halb zu veröffentlichen, dass sie von mir aus sichtbar ist, aber sonst unsichtbar? Oder was ist der empfohlene Weg, eine eigene Library einzubinden?
nezzcarth
User
Beiträge: 1778
Registriert: Samstag 16. April 2011, 12:47

Man kann Pakete per pip/pip -e auch aus lokalen Quellen oder auch git installieren. Dafür musst du aber aus deinem "library_project" ein korrektes Python-Package machen. Leider ist Packaging eines der etwas unschöneren Themen bei Python, weil da ein ziemliches Wirrwarr herrscht, aber hier findest du einen guten Einstieg über die notwendigen Strukturen und Tools, die helfen können: https://packaging.python.org/en/latest/
Sirius3
User
Beiträge: 18298
Registriert: Sonntag 21. Oktober 2012, 17:20

Eigentlich ist es nicht sehr kompliziert, aus einem Verzeichnis mit Python-Dateien eine ordentliche Bibliothek zu machen, die man auch sauber installieren kann.
Vielleicht ist die Technische Spezifikation nicht gerade anfängerfreundlich.
Die wesentlichen Punkte sind eine saubere Projektstruktur und eine pyproject.toml-Datei aus der man ein wheel erzeugen kann, das man einfach installieren kann.
https://realpython.com/python-pyproject-toml/
https://devsjc.github.io/blog/20240627- ... ject-toml/

Und natürlich ist lib kein guter Name für eine Bibliothek, weil zu generisch.
Pedroski55
User
Beiträge: 16
Registriert: Freitag 25. Juli 2025, 00:20

In Linux kannst du so vorgehen, keine Ahnung wie man das in Windows macht!

öffne ein Terminal, schreibe
echo $0
dann weißt was für ein Terminal du hast. Ich habe bash.

Im Heimatverzeichnis habe ich dann eine Datei: .bashrc (vielleicht hast du .zshrc)

Ganz am Ende vom .bashrc schreibe eine neue Zeile:
export PATH=$PATH:/pfad/zu/meiner/dateien
.bashrc nun speichern

Im Terminal schreibe:
source ~/.bashrc
um .bashrc neu zu laden.

Im Terminal schreibe
echo $PATH
am Ende vom $PATH sollte dein Verzeichnis nun stehen.

Dies hilft nur dir. Wenn auch andere User hiervon profitieren sollen, mußt du:
sudo nano /etc/profile.d/eigener_pfad.sh
Schreibe dies drinne:
export PATH=$PATH:/pfad/zu/meiner/dateien
Speichern, dann einlesen: Im Terminal schreibe Folgendes um /etc/profile.d/eigener_pfad.sh zu laden.
source /etc/profile
Vertrauen ist gut, Kontrolle ist besser:
echo $PATH
Danach sollte Python immer deine Dateien finden.

Das gesagt, ich habe lange Zeit nur wie du gemacht: Ich habe nen selbstgemachten Modul OMRv2.py, ist etwa 15 Funktionen.

Code: Alles auswählen

import glob, sys

sys.path.append('/home/pedro/myPython/myModules/')

import OMRv2
Ich hatte nie Probleme damit!
Benutzeravatar
__blackjack__
User
Beiträge: 14133
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pedroski55: Wenn man im Terminal ``echo $0`` ausführt, weiss man nicht welches Terminal man verwendet, sondern welche Shell. Terminal(-Emulator) und Shell sind unterschiedliche Programme, die man unabhängig voneinander auswählen kann.

Das Terminal kann man nicht so einfach ermitteln. Es gibt die Umgebungsvariable $TERM, die aber einen Terminal-Typ enthält, nicht den Namen der konkreten Software die diesen Terminal-Typ emuliert. Nur in recht seltenen Fällen stimmen dieser Typ und das verwendete Terminal tatsächlich überein. Es gibt beispielsweise den Typ `xterm` und den Terminal-Emulator `xterm`. Aber der Typ `xterm` wird auch von einer ganzen Reihe anderer Terminal-Emulatoren unterstützt. Ich verwende hier gerade beispielsweise kein `xterm`, aber:

Code: Alles auswählen

$ echo $TERM
xterm-256color
Die Umgebungsvariable $PATH hat nichts damit zu tun wie Python Module/Packages zum importieren findet, die hat also mit der Frage gar nichts zu tun.

Das Du es lange Zeit wie zegru gemacht hast, hilft zegru ja jetzt nicht wirklich weiter. Wie machst Du es denn *jetzt*?
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
nezzcarth
User
Beiträge: 1778
Registriert: Samstag 16. April 2011, 12:47

@Pedroski55: Meinst du vielleicht die Umgebungsvariable "PYTHONPATH"? Diese könnte man in dem Fall verwenden, ich rate aber nicht dazu. Die aktuelle Shell kann man mit "ps -p $$" bestimmen. Bei "$0" muss man vorsichtig sein, weil das innerhalb von Skripten für den Namen des Skripts steht.

@Sirius3: Ich hab' auch nicht gesagt, dass es kompliziert ist ein Paket zu machen. Unübersichtlich finde ich es aber schon. Die Paketsituation bei Python ist verglichen mit der sonstigen Eleganz der Sprache in meinen Augen das reinste Chaos. Diverse Standards, etliche Tools, etc. Dass man letztendlich nur eine pyproject.toml und eine saubere Struktur braucht, ist richtig, aber da muss man als Anfänger ja erst einmal hinkommen, das zu verstehen und sich von den restlichen Infos nicht ablenken lassen.
zegru
User
Beiträge: 66
Registriert: Freitag 9. Oktober 2020, 09:22

Das mit dem Packaging in Python sieht echt nach einer recht steilen Lernkurve aus...
Habt ihr einen Tipp, welches Tool mein Leben einfacher machen könnte, oder wird das dann gleich ein Glaubenskrieg?
Ich persönlich liebäugle mit uv. Im Moment verwende ich venv und pip, also packaging praktisch gar nicht, und wenn dann nur aus Versehen.
Wie stellt man eigentlich seine bisherigen Projekte um? Speziell habe ich ein etwas größeres Projekt, das auch ein 'lib' Verzeichnis hat. Wie ist da die 'best practice'? Und kann ich das auch gut mit meiner IDE verbinden? Und alles damit machen, das ich bis jetzt immer 'zu Fuß' gemacht habe, beispielsweise Tests laufen lassen? Und braucht man als Dritter dann ebenfalls uv, oder geht dann auch ohne? Also geht nur `uv run xyz.py` oder geht auch `./xyz.py`?
zegru
User
Beiträge: 66
Registriert: Freitag 9. Oktober 2020, 09:22

Und kann man auch ein FLASK Projekt starten?
Im Moment mache ich das mit

Code: Alles auswählen

FLASK_APP=web.xy PYTHONPATH=$PWD FLASK_DEBUG=True flask run
gibt es so etwas wir 'uv run flask'?
Und ich habe gerade festgestellt, dass mein Hosting Anbieter uv gar nicht erst installiert hat. Läuft die FLASK Applikation dennoch? Sie wird normalerweise über WSGI gestartet.
Benutzeravatar
noisefloor
User
Beiträge: 4208
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wieso willst du Flask im Rahmen der Library automatisch starten? Macht man eigentlich nicht implizit, sondern nur explizit.

Und Flask produktiv auf einem (externen) Server laufen zu lassen und dafür den eingebauten Dev-Server zu nutzen, ist keine gute Idee. Da wird in der Flask Doku auch drauf hingewiesen. Normalerweise nimmt man immer einen WSGI Applikationsserver (gunicorn, Waitress, ...) und ggf. noch einen Reverse PRoxy (z.B. nginx) davor. Und den / die Server startet man beim Systemstart via systemd Service Unit (auf Linux Systemen).

Gruß, noisefloor
zegru
User
Beiträge: 66
Registriert: Freitag 9. Oktober 2020, 09:22

Ich will das ja nicht produktiv laufen lassen. Das macht ja mein Hosting Dienst, mit einem Web Server mit einer WSGI Schnittstelle. Geht das Dateien unter uv?
Sondern ich möchte das Programm lokal auf localhost mit dem mitgelieferten Webserver laufen lassen, um es erstmal im Testbetrieb zu sehen.
Benutzeravatar
noisefloor
User
Beiträge: 4208
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Ok - aber wo ist jetzt das Problem? Und wo ist der Zusammenhang zur "eigene Library erstellen"? Weißt du, wozu uv gut ist bzw. was das macht? Das ist im Moment alles ziemlich wirr...

Gruß, noisefloor
nezzcarth
User
Beiträge: 1778
Registriert: Samstag 16. April 2011, 12:47

zegru hat geschrieben: Mittwoch 3. September 2025, 11:20 Habt ihr einen Tipp, welches Tool mein Leben einfacher machen könnte, oder wird das dann gleich ein Glaubenskrieg?
Mit 'uv' hast du denke ich schon das Tool gefunden, das im Moment sehr beliebt ist oder über das zumindest viel geredet wird. Persönlich sehe ich uv skeptisch (es kommt von einer Firma, deren Geschäftsmodell für mich nicht so richtig klar ist) und benutze lieber etwas anders (pdm), aber ich habe den Eindruck, dass uv die besten Chancen hat, sich längerfristig zu etablieren. Mit 'uv init' / 'uv init --package' kannst du dir ein Grundgerüst anlegen lassen, in das du deinen Code migrieren kannst. Gibt auch noch Weitere Tools (bei Interesse; den Text fand ich ganz gut: https://alpopkes.com/posts/python/packaging_tools/)
zegru
User
Beiträge: 66
Registriert: Freitag 9. Oktober 2020, 09:22

Danke für den Link!
Und ein Hinweis auf die Antworten vorher: Ich habe echt die Fragen eines blutigen Anfängers gestellt. Und zwar aus einem einfachen Grund: ich bin einer, was das Packaging angeht. Und wie ich schon sagte, wird es eine ziemlich steile Lernkurve werden. Und noch stehe ich im Tal davor. Und ich frage mich gerade, was ich in meinen Rucksack packen soll, das mich auf dem steilen Weg möglichst unterstützt, statt mir ständig auf die Füße zu fallen. Und jetzt gerade stelle ich noch echt blöde Fragen, über die mein zukünftiges Ich die Augen rollen wird.
zegru
User
Beiträge: 66
Registriert: Freitag 9. Oktober 2020, 09:22

Ich habe mir mal PDM angesehen, und es kommt recht gut weg.
Ich dachte mir mal kurz "Nimm einfach uv und gut is", aber dann kam auch noch PDM in die nähere Auswahl.
Ist die Auswahl eher sekundär, oder sollte man sich das gut überlegen?
Antworten