Seite 1 von 1

Cmd in pyenv Umgebung ohne command completion

Verfasst: Donnerstag 24. Februar 2022, 08:37
von shoening
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

Re: Cmd in pyenv Umgebung ohne command completion

Verfasst: Donnerstag 24. Februar 2022, 15:52
von __blackjack__
Ist das `readline`-Modul vorhanden und funktioniert das?

Re: Cmd in pyenv Umgebung ohne command completion

Verfasst: Donnerstag 24. Februar 2022, 19:15
von shoening
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.

Re: Cmd in pyenv Umgebung ohne command completion

Verfasst: Donnerstag 24. Februar 2022, 19:33
von __blackjack__
@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.

Re: Cmd in pyenv Umgebung ohne command completion

Verfasst: Donnerstag 24. Februar 2022, 20:11
von shoening
@_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

Re: Cmd in pyenv Umgebung ohne command completion

Verfasst: Samstag 5. März 2022, 18:54
von shoening
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.

Re: Cmd in pyenv Umgebung ohne command completion

Verfasst: Samstag 5. März 2022, 19:59
von narpfel
@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.

Re: Cmd in pyenv Umgebung ohne command completion

Verfasst: Dienstag 8. März 2022, 14:24
von shoening
@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.

Re: Cmd in pyenv Umgebung ohne command completion

Verfasst: Dienstag 8. März 2022, 16:10
von narpfel
@shoening: Das hatte __blackjack__ schon in der allerersten Antwort geschrieben. ;-)

Re: Cmd in pyenv Umgebung ohne command completion

Verfasst: Mittwoch 9. März 2022, 14:20
von shoening
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.