Wie kann Vim Python und Python3 auf einem Linux-System in derselben Sitzung ausführen?

28

Auf Linux-Systemen ist in Packaged Vim normalerweise nur eines von beiden pythonoder nur eines python3aktiviert. Es ist möglich, dass beide aktiviert sind (mithilfe von python/dynund python3/dyn), aber während einer Sitzung kann nur eine verwendet werden. Diese Mailingliste Diskussion sagte :

Dies hängt davon ab, wie die Python-Bibliotheken erstellt werden. Auf Debian-basierten Systemen (aus Gründen, an die ich mich nicht ohne weiteres erinnere) sind sie so aufgebaut, dass RTLD_GLOBAL verwendet werden muss, um Zugriff auf die Symbole zu erhalten. Dadurch wird verhindert, dass sowohl libpython2.x als auch libpython3.x im selben Prozess geladen werden.

Was kann getan werden, um das Laden von beiden in derselben Sitzung zu ermöglichen?

Optionen, die ich sehen kann:

  • Erstellen Sie die Python {2,3} -Pakete neu, sodass RTLD_GLOBAL(was auch immer) nicht benötigt wird.
  • Irgendwie wird die Bibliothek früher geladen, um von Vim entladen zu werden (?!). (Ist das überhaupt möglich?)

Nehmen Sie für alle Einzelheiten der Distribution in aufsteigender Reihenfolge der Spezifität an:

  • Debian-basiert
  • Ubuntu
  • Ubuntu 14.04
  • Oder Arch Linux, wenn ein Debian-basiertes System zu komplex ist.

Beachten Sie, dass ich Vim mit Unterstützung für dynamisches Laden für beide erstellen lassen muss , sodass das Erstellen von Vim kein Problem darstellt.

muru
quelle

Antworten:

17

Ich bin der aktuelle Vim-Betreuer für Debian und die Person, die in der Diskussion über die Mailingliste angegeben ist.

Wie Sie sagten, ist dies keine Frage zu Vim. Es geht darum, die Software, mit der Vim eine Verknüpfung herstellt, so zu erstellen, dass sie Ihren Anforderungen entspricht. Es gibt eine gründlichere Diskussion (zumindest für den Debian-Aspekt) des Problems in einem Fehler , bei dem Python3 in Debians Vim- Paket aktiviert werden soll.

Das läuft auf

  • Debians Python-Paket verknüpft die Python-Erweiterungen nicht mit der entsprechenden gemeinsam genutzten libpython-Bibliothek. Dies ist der Grund, warum Debians Vim-Paketierung die Verwendung erfordert, RTLD_GLOBALwenn dlopen()die Python-Sprachbindungen dynamisch geladen werden.

  • Es gibt keine guten Möglichkeiten, die Beziehung zwischen den Vim-Paketen und den dynamisch geladenen Bibliotheken auszudrücken, um sicherzustellen, dass sie bei Bedarf gemeinsam aktualisiert werden. Selbst wenn der erste Punkt behoben wäre, würde dieses Problem mich immer noch daran hindern, das dynamische Laden der Python-Unterstützung zu ermöglichen.

    Der Hauptpunkt beim dynamischen Laden der Sprachunterstützung in Vim besteht darin, dass Benutzer keine Bibliotheken installieren müssen, die sie nicht verwenden. Dies bedeutet, dass das Vim-Paket keine feste Abhängigkeit von einer Mindestversion einer Bibliothek angeben kann.

    Wenn Vim mit einer neueren Version einer Bibliothek erstellt wird, die nicht mit der älteren Version abwärtskompatibel ist, und der Benutzer sie nicht zusammen aktualisiert, stürzt Vim ab. Ich möchte nicht, dass die Benutzer der Pakete darauf stoßen.

Ich würde gerne in der Lage sein, das dynamische Laden der Sprachunterstützung wieder zu aktivieren (es war 2010-2011 für eine kurze Zeit verfügbar), aber die oben genannten Probleme müssen zuerst behoben werden.


Seit Version 2: 7.4.2330-1 verwendet Debians Paketierung Python3 anstelle von Python2 für die Python-Bindungen.


Alternativ unterstützt das neovim-Paket die Verwendung von Python2 und Python3 aus demselben nvim-Prozess, da die Python-Unterstützung von externen Modulen (den Paketen python-neovim und python3-neovim ) bereitgestellt wird . Das Externalisieren des Python-Codes, anstatt ihn wie Vim einzubetten, vermeidet die Frage, wie Libpython erstellt wird.

Jamessan
quelle
"Dies bedeutet, dass in der Vim-Verpackung keine feste Abhängigkeit von einer Mindestversion einer Bibliothek angegeben werden kann." Ich nehme an, deshalb hat Debian keine separaten Pakete für Vim + Python2 und Vim + Python3 wie Arch Linux?
muru
@muru Python ist nur eine der verfügbaren Sprachbindungen. Das Bereitstellen von Paketkombinationen für die verschiedenen Sprachen und GUI-Toolkits ist eine große Anzahl von Paketen. Die Entscheidung war, so viele Sprachbindungen wie möglich zu aktivieren und die Wahl zwischen GUI-Toolkits zu lassen (oder nicht). Ein Benutzer sollte nicht Vim-Plugins auswählen müssen, die auf der Sprache basieren, in der sie geschrieben sind.
Jamessan
Das ist kein wirkliches Argument, da sich nur Python und Python3 widersprechen. Ich denke ehrlich, Sie sollten sich ein Blatt aus dem Buch der Arch-Entwickler ausleihen. Abgesehen von einem gemeinsamen vim-runtimePaket, haben sie vim, gvim, vim-python3und gvim-python3. Der einzige Unterschied zwischen den -python3und den normalen Paketen ist die Version von Python aktiviert. Sicher, es verdoppelt die Anzahl der Frontend-Pakete, aber das ist alles, was ich an solchen Verpackungen sehe.
muru
Das ist für Arch. In Debian gibt es vim-nox, vim-gtk, vim-gnome, und vim-athena. Es lohnt sich nicht, diese zu verdoppeln, damit Benutzer immer noch nicht sowohl Python- als auch Python3-Plugins verwenden können.
Jamessan
Ich bin ein bisschen neugierig, warum Sie nicht die dynamische Option für die normalen Pakete gewählt haben.
Muru
4

In Ubuntu 16.04 sind jetzt vim-*-py2Pakete im Repo enthalten. Dies bedeutet, dass alle Debian Vim-Benutzer bei Bedarf auf Ubuntu migrieren können.

Die früheren vim-*Pakete bieten jetzt +python3und die Binärdateien sind anders benannt, um Konflikte zu vermeiden:

Und so weiter.

dfggdfgdfgdfgdfgdfgdfgdfg
quelle
Also kann ich am 16.04 Python2 und Python3 in derselben Vim-Sitzung laden?
muru
@muru nein, Sie können einfach auswählen, welche Sie in einer bestimmten Sitzung leichter bekommen;)
Hobbs
@hobbs Ich bin mir ziemlich sicher, dass die Pakete mit denen von python3 in Konflikt stehen.
muru
@muru tun sie in der Tat nicht. Sie können beides installieren und ausführen lassen, je nachdem, welches Sie auswählen, oder eines als Standard-VIM auswählen. Es ist nicht großartig, aber es ist eine Verbesserung.
Hobbs
2
Und jetzt, mit 17.04, wurden die Python 2-Unterstützung und die entsprechenden Vim-Pakete eingestellt
muru