Eigene CLI Anwendung per pipx (bzw. hatchling) installieren

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
loph
User
Beiträge: 7
Registriert: Freitag 3. November 2023, 22:32

Hallo Forum!

Nach Jahren des 'Herumfrickelns' möchte ich gerne meine selbst erstellten Python-Skripte sauber mittels pipx in meinem Userverzeichnis (Debian Linux) installieren.

Ich schaffe es aber nicht, einen CLI-Einsprungspunkt zu konfigurieren.

Meine-Testprojektstruktur sieht so aus:

Code: Alles auswählen

.
├── pyproject.toml
└── src
    └── test2
        ├── app.py
        ├── globals.py
        ├── __init__.py
        └── __pycache__
            ├── app.cpython-313.pyc
            ├── globals.cpython-313.pyc
            └── __init__.cpython-313.pyc
In pyproject.toml habe ich:

Code: Alles auswählen

[build-system]                                                                  
requires = ["hatchling"]                                                        
build-backend = "hatchling.build" 

[project]                                                                       
name = "test2"
dynamic = ["version"] 

[tool.hatch.version]                                                            
path = "src/test2/globals.py"

[project.scripts]                                                               
cli-name = "app:main"
In app.py befindet sich:

Code: Alles auswählen

VERSION = "test-1-2-3"
def main():                                                                     
    print("Hallo Version:", VERSION)
Hier habe ich ein 'VERSION'-dummy eingebaut. Hatchling holt sich die Version jedoch dynamisch aus globals.py, was wohl auch funktioniert.

Was leider NICHT funktioniert ist
cli-name = "app:main"

Ich habe alle möglichen Kombinationen von
cli-name = "foo.bar.baz.hin.und.her:main"
ausprobiert, aber ich bekomme IMMER die Fehlermeldung:
====> '.' executable script not found in package 'test2'. <====

Dabei starte ich pipx so (wenn dass klappt, würde ich :
pipx run --no-cache .

Teilweise bezog sich die Fehlermeldung auch auf vorherige Test-Versionen, weshalb ich hier --no-cache verwende.

Ich habe auch schon versucht meine main() in __init__.py zu exportieren, was aber auch nichts gebracht hatte.

Jetzt bin ich an einem Punkt angekommen, wo ich einfach nicht mehr weiter weiß und hoffe, hier Hilfe zu bekommen. Oder ist es etwa generell quatsch "pipx run" zu verwenden?

LG
loph

p.s.
Kleine Bonus-Task: Wie importiere ich am besten VERSION aus globals.py in meine app.py, sodass ich app.py direkt mit "python app.py", aber auch innerhalb von test2 als Modul ausführen kann ( __init__.py beinhaltet: "from .globals import VERSION")?
Sirius3
User
Beiträge: 18408
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Referenz zum Script muß ein völlständig sein, als

Code: Alles auswählen

[project.scripts]                                                               
cli-name = "test2.app:main"
Und pipx sagt mir, dass es ein `--spec` möchte:

Code: Alles auswählen

$ pipx run --spec . cli-name
Und man startet nicht einfach ein Skript per Dateiname in irgendeinem Paket. Dafür gibt es ja scripts, oder `python -m test2.app`.
loph
User
Beiträge: 7
Registriert: Freitag 3. November 2023, 22:32

Vielen Dank für die schnelle Antwort, Sirius3!
Sirius3 hat geschrieben: Freitag 1. Mai 2026, 13:17 Und pipx sagt mir, dass es ein `--spec` möchte:
Die Sache mit --spec ist mir auch aufgefallen und ich habe genauso versucht
pipx run --spec . test2.app:main
in allen möglichen Variationen auszuführen (ich habe --spec so interpretiert, dass durch diese Option der Eintrag in pyproject.toml überschrieben wird).

Alles was ich durchprobiert habe, ist aber weiterhin bei folgender Fehlermelung gelandet:
'test2.app:main' executable script not found in package 'test2'.

LG
loph

p.s.
Ich habe meinen Editor auch dahingehend konfiguriert, die aktuelle Datei mit "python3 -m aktuelle_datei" zu starten. Danke für den Hinweis.
Sirius3
User
Beiträge: 18408
Registriert: Sonntag 21. Oktober 2012, 17:20

Beim Programmieren muß man schon exakt das so machen wie angegeben, und nicht irgendetwas raten.
loph
User
Beiträge: 7
Registriert: Freitag 3. November 2023, 22:32

"pipx run --spec . cli-name" funktioniert, danke!
Antworten