Cmd in pyenv Umgebung ohne command completion

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
shoening
User
Beiträge: 21
Registriert: Donnerstag 20. Oktober 2011, 19:28

Hallo,

ich habe mir angewöhnt, bei Entwicklungen mit Python pyenv zu verwenden, um neben einer virtuellen Python Umgebung auch die Python Version festlegen zu können.

Ich verwende zur Entwicklung kleiner Werkzeuge oft die Python Bibliothek Cmd.

Wenn ich mit pyenv die Python Version einstelle, die mein Betriebssystem (Debian 11) mitliefert, dann funktioniert bei Cmd die „command completion“.

Wenn ich allerdings z.B. die aktuellste über pyenv installierbare Major-Release (3.9.5) verwende, dann funktioniert „command completion“ nicht.

Hier ein einfaches Cmd-Beispiel-Script: (Das einzige unterstützte Kommande ist 'exit')

Code: Alles auswählen

#!/usr/bin/env python3

from cmd import Cmd

class ExampleCmd(Cmd):
    def __init__(self):
        Cmd.__init__(self)

    def do_exit(self, line):
        return True

if __name__ == '__main__':
    ExampleCmd().cmdloop()

Wenn ich in dem Verzeichnis dann mittels pyenv das System-Python einstelle:

Code: Alles auswählen

pyenv local system
und das Script aufrufe

Code: Alles auswählen

python cmd_example.py
und dann den Buchstaben e eingebe und dann die Tabulatortaste betätige, wird die Eingabe zu exit vervollständigt.

Wenn ich mittels pyenv die Python Version 3.9.5 einstelle:

Code: Alles auswählen

pyenv local 3.9.5
Dann funktioniert die Kommando-Vervollständigung nicht.

Kann mir irgendjemand einen Tipp geben, was ich tun muss, damit Tab-Completion unter pyenv auch mit anderen Python Versionen als der System Version funktioniert?

Viele Grüße
Stefan
Benutzeravatar
__blackjack__
User
Beiträge: 13998
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ist das `readline`-Modul vorhanden und funktioniert das?
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
shoening
User
Beiträge: 21
Registriert: Donnerstag 20. Oktober 2011, 19:28

Das readline Modul hatte ich in der pyenv Umgebung mit Python 3.9.5 auch schon einmal installiert.
Das hatte bzgl. der command-completion keine Auswirkungen.
Benutzeravatar
__blackjack__
User
Beiträge: 13998
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@shoening: Wie hast Du das installiert? Das ist eigentlich in der Standardbibliothek, falls `libreadline` beim kompilieren entsprechend da war. Wüsste nicht, dass man das *nachträglich* installieren kann.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
shoening
User
Beiträge: 21
Registriert: Donnerstag 20. Oktober 2011, 19:28

@_blackjack_:
Das habe ich in der pyenv-virtualenv Umgebung mittels

Code: Alles auswählen

pip install readline
installiert.

Ich hatte bei der Suche nach einer Lösung für das Problem auch Beiträge gefunden, die darauf hindeuteten, dass readline fehlt.
Daher hatte ich das auch schon probiert.

Ich überlege noch, ob ich mir das CPython einmal manuell aus den Sourcen baue, um zu schauen, ob ich da mit irgendwelchen Konfigurationsparametern eine Änderung erzielen kann.

Ansonsten tappe ich aktuell im Dunkeln - und benutze solange eben das system Python 3 - also das, was beim Debian mit installiert ist.

Viele Grüße
Stefan
shoening
User
Beiträge: 21
Registriert: Donnerstag 20. Oktober 2011, 19:28

Ich habe mir jetzt einmal manuell ein CPython aus den Sourcen der Version 3.10.2 gebaut.
Damit funktioniert auch die Command-Completion.

Mein Verständnis ist, dass pyenv beim Installieren einer CPython Version ebenfalls die Sourcen übersetzt und das Python dann lokal installiert. Ich vermute mal, dass da irgendwelche Voreinstellungen gemacht werden, die dazu führen, dass die Command Completion nicht funktioniert.

Da bleibt nur - weiter forschen.
narpfel
User
Beiträge: 690
Registriert: Freitag 20. Oktober 2017, 16:10

@shoening: pyenv ist bekannt™ dafür, dass man sich da gerne mal ein kaputtes Python mit baut. Meine Vermutung ist, dass du in der Zwischenzeit `libreadline-dev` installiert hast (oder `apt build-dep python3` ausgeführt hast) und dass dein manuell gebautes Python deswegen mit readline-Support kompiliert wurde.

Hast du die hier gelisteten Pakete vor dem Kompilieren mit pyenv installiert? https://github.com/pyenv/pyenv/wiki

Die letzten Zeilen von der `make`-Ausgabe enthalten eine Liste mit allen Builtin-Modulen, die nicht gebaut werden konnten. Wird das auch beim Kompilieren mit pyenv angezeigt? Das wäre ein Ansatz, da mal nachzugucken.
shoening
User
Beiträge: 21
Registriert: Donnerstag 20. Oktober 2011, 19:28

@narpfel: Danke für den Hinweis mit „... in der Zwischenzeit 'libreadline-dev' installiert ...“.

Das scheint es gewesen zu sein. Ich habe die entsprechende Python Version in pyenv noch einmal entfernt und dann neu installiert.
Jetzt geht auch die Command Completion.
narpfel
User
Beiträge: 690
Registriert: Freitag 20. Oktober 2017, 16:10

@shoening: Das hatte __blackjack__ schon in der allerersten Antwort geschrieben. ;-)
shoening
User
Beiträge: 21
Registriert: Donnerstag 20. Oktober 2011, 19:28

Jein: Das Problem ist mir neulich erst aufgefallen. Da hatte ich allerdings die Python Version 3.9.5 innerhalb von pyenv schon lange installiert - und irgendwann später auch einmal libreadline-dev - allerdings vielleicht auch nicht im Zusammenhang mit diesem Problem.

Dass es auf den Zeitpunkt der Installation von libreadline-dev ankommt, so dass ich dann die Python Version in pyenv erst einmal entfernen und dann neu installieren muss, ergab sich aus dem Beitrag von __blackjack__ für mich nicht.

Mal wieder was gelernt - besten Dank nochmal.
Antworten