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: 61
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: 1775
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: 18291
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: 12
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: 14097
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: 1775
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.
Antworten