QGIS/PIP: Pakete installieren klappt nicht

Probleme bei der Installation?
PyGuest
User
Beiträge: 28
Registriert: Mittwoch 25. Mai 2022, 10:57

Hi,

ich habe eine (frisch aufgesetzte) Installation von QGIS 3.22.16. Diese enthält ein Python 3.9.
Meine Absicht ist es, einige Plugins dafür zu schreiben, was aber voraussetzt, dass ich einige Module nachinstallieren kann, u.a. cx_Oracle.

Wenn ich vom Scripts- Verzeichnis aus PIP aufrufe, bekomme ich die Fehlermeldung

Code: Alles auswählen

Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'
Pyhonhome und pythonpath sind nicht gesetzt (laut Internet- Recherche sollte das auch so sein)

Nächster Versuch:

Code: Alles auswählen

python.exe -m pip install cx_Oracle --upgrade
...
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/cx-oracle/
direkt aus der Python- Console von QGIS:

Code: Alles auswählen

import sys
import subprocess

def Package_Install(package):
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', package])
    
Package_Install('oracledb ')
führt zu: Ungültige Datenquelle: C:\WINDOWS\system32\oracledb ist keine gültige Datenquelle oder wird nicht erkannt.
(oracledb soll wohl der neue heiße Scheiß nach cx_Oracle sein)

Was kann ich tun?
- Windows 10
- hinter Firewall und Zwangsproxy
- Version fest vorgegeben
- ich brauche das jetzt nicht unbedingt in einer virtuellen Umgebung, da dieses Modul im Grunde für ALLE Plugins benötigt wird
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Klingt fummelig. Ich würde mal ein Python 3.9 installieren, ein venv anlegen, und oracledb darein installieren. Dann kann anschauen, was das alles umfasst. Und die Dateien in die Site-packages oder verwandte Orte von QGIS packen. Alternativ QGIS aus den Quellen bauen, und die dann so ändern, dass die enthaltene Python Version weniger kastriert ist. Aber das hilft nur, wenn du das upstream bekommst. Das könnte man mit denen diskutieren, oder sogar da einfach ein Bug Ticket zu diesem Problem erstellen.
PyGuest
User
Beiträge: 28
Registriert: Mittwoch 25. Mai 2022, 10:57

Diese Möglichkeiten habe ich alle nicht. Ich habe keine Administratorrechte und darf auch nicht ohne Weiteres Dinge installieren (oder installieren lassen), die nicht vorher "sicherheitsgeprüft" sind. Python und QGIS genügen glücklicherweise dem Merkmal "Standard- Software", so dass ich glücklicherweise nicht einmal ein Problem mit dem nachinstallieren von Modulen habe. Aber ich muss es eben mit Bordmitteln hinbekommen oder für die Admins eine klare Strategie benennen können, die sie durchführen. Keiner der Admins setzt sich neben mich, wenn ich "herumprobiere" ...
Tatsächlich hatte ich mal versucht, von GQIS über sys.path.append(...) auf eine korrekt installierte Oracle- Bibliothek (ich glaube, 3.10, könnte aber auch 3.7 gewesen sein) zuzugreifen und das hat auch funktioniert. Die Plugins sollen zwar im Grunde nur im Unternehmen an wenigen Stellen ausgerollt werden und die könnte man schon auf diese Weise "türken". Aber das sollte doch nicht der empfohlene Lösungsweg sein.
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Meine Strategie war ja erstmal dazu gedacht, überhaupt eine funktionsfähige Umgebung zu bekommen. Mit keinem Wort habe ich gesagt, dass wäre der Weisheit letzter Schluss. Aus dem Ansatz kann man dann zb einen Installer paketieren.

Empfohlen wäre wie schon erwähnt eine Lösung, die den Interpreter in QGIS upstream befähigt, den Vorgang durchzuführen. Ob du darauf warten kannst, oder gar die Möglichkeit hast, das selbst beizusteuern, wenn über allem der bastard Operator from hell trohnt, keine Ahnung.
PyGuest
User
Beiträge: 28
Registriert: Mittwoch 25. Mai 2022, 10:57

Ich habe mir eine Python 12- Version installieren lassen (wobei ich diese nicht finde. Wurde als Admin installiert und anscheinend kann die im Moment auch nur der Admin starten ...).
Bei Python finde ich dummerweise keinen Installer mehr für 5.9.18, sondern nur noch Quellen. Macht es Sinn, zu versuchen, das aus den Quellen zusammenzubasteln?
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na du hast ja einen anderen Weg gefunden, am Ende ist das vergleichbar. Du musst eben die Menge der Dateien bestimmen, die da installiert werden, die an eine Stelle packen, und dem eingebetteten Interpreter sagen, dass die da liegen. Oder schauen, ob der eingebettete Interpreter ein Site-packages Verzeichnis hat. Das sollte sich zb durch Betrachtung von sys.path ergeben.
PyGuest
User
Beiträge: 28
Registriert: Mittwoch 25. Mai 2022, 10:57

Du willst also sagen, ich soll statt Installation dort, wo es hingehört, es irgendwo installieren, von dort aus an eine festgelegte Stelle kopieren und dann mit sys.path einbinden? Klingt möglich, aber gruselig, insbesondere, wenn man irgendwann mal eine neue Version braucht oder das doch auch an Stellen ausrollen soll, die man nicht so in der Hand hat.
Gibt es keine Möglichkeit, beispielsweise die Fehlermeldung "ModuleNotFoundError: No module named 'encodings'" wegzubekommen oder diese SSL- Geschichte lösen kann?
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, das ist nicht was ich gemeint habe. Ich habe gemeint, dass du rausfinden sollst, wo der eingebettete Interpreter selbst nach Python Paketen sucht, und dein Paket dahin kopieren. Das Ergebnis ist dann nicht anders, als ob ein normaler installer das gemacht hätte. Pip kocht ja auch nur mit Wasser.

Und die Möglichkeit das wegzubekommen, habe ich jetzt schon mehrfach genannt: das als Bug oder missing feature zu Reporten, und ggf. selbst zu reparieren. Denn das deutet nunmal auf einen deutlich eingeschränkten Interpreter hin. Das ist aber alles andere als trivial. Und erfordert tiefere Kenntnisse des Python Interpreters und seiner C-Implementierung, als auch der Art, wie er eingebettet wurde.

Eine “import magie; magie.hex_hex()”-artige Lösung sehe ich nicht. Aber vielleicht haben da andere Leute mehr Ideen.
PyGuest
User
Beiträge: 28
Registriert: Mittwoch 25. Mai 2022, 10:57

Ich danke Dir für Deine Ausführungen. Wie könnte ich denn herausbekommen, was genau alles passiert, wenn pip irgendwas installiert? Meinst Du so etwas, wie eine nackte Virtuelle Umgebung einrichten, die Menge an Dateien und Hashes dazu in eine Datenbank stopfen, danach mit pip das Gewünschte installieren und das Ergebnis mit der Datenbank abgleichen?

Klingt natürlich machbar, habe nur keine Ahnung, wie nachhaltig das ist gegenüber Updates oder bereits vorhandenen Installationen bei anderen Nutzern. Muss ich mir mal detaillierter ansehen :cry:
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du nimmst das Python her, fuer das du das ja schon installiert bekommen hast, baust zwei venvs, und installierst in das eine das gewuenschte Paket. Dann siehst du, was der alles installiert hat, wenn du da rekursiv diffst.

Was die Nachhaltigkeit angeht - wissen kann ich das nicht, aber ich glaube, die Python3 ABI ist ziemlich stabil, und damit hast du gute Chancen, dass ein gebautes Paket ne Weile funktioniert. Bis es das eben nicht mehr tut, einen Weg drumrum sehe ich nicht, ausser eben den QGIS-interpreter zu befaehigen, normal Pakete zu installieren. Weil man dann von upstream-Arbeit profitiert.
PyGuest
User
Beiträge: 28
Registriert: Mittwoch 25. Mai 2022, 10:57

Und schon geht es weiter mit den Problemen ...

habe eine Virtuelle Umgebung gebaut und versucht, mit pip install folgende Pakete zu installieren
matplotlib -> kein Problem

cx_Oracle ->

Code: Alles auswählen

...
Building wheel for cx_Oracle (pyproject.toml) ... error
  error: subprocess-exited-with-error
<string>:6: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
...
building 'cx_Oracle' extension
      error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
Was muss ich hier tun?
Deprecated - na gut. Aber ich würde schon gern noch den bisher eingesetzten Code erst einmal nutzen wollen, ehe ich ihn erneut anpassen muss :(
Vorschläge?
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hattest du nicht ein anderes Paket benutzt und erfolgreich installiert?
PyGuest
User
Beiträge: 28
Registriert: Mittwoch 25. Mai 2022, 10:57

jupp, bevor ich alles deinstallieren und neu installieren lassen habe :(
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

In der Dokumentation zu `cx_Oracle` steht am Anfang diese Notiz:
cx_Oracle has a major new release under a new name and homepage python-oracledb.

New projects should install python-oracledb instead of cx_Oracle.
Will man das dann überhaupt noch verwenden?

Ansonsten gibt es von dem Projekt einen Haufen Wheel-Dateien, also sollte man schauen warum bei Dir lokal versucht wird eines zu bauen, statt ein fertiges vom Package-Index herunter zu laden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
PyGuest
User
Beiträge: 28
Registriert: Mittwoch 25. Mai 2022, 10:57

Im Grunde würde ich neue Dinge dann auch gern mit python-oracledb machen, bekomme ich auf dem System sogar installiert, aber wieder nicht unter QGIS. ABer für den bereits verbrochenen Code bräuchte ich das, wenn ich nicht vor jeder Benutzung umstricken will.
Was sind wheel- Dateien? Wie kann ich sie nutzen? Wie bekomme ich denn heraus, WARUM bei mir lokal versucht wird, eines zu bauen? Hat er früher ja auch nicht gemacht. Und es ist für mich schon unmöglich, nachzuvollziehen, was all die Admins seit der letzten erfolgreichen Installation so alles geändert haben. Was sich in der großen weiten Welt verändert hat, ist völlig ausgeschlossen.
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wheels sind die Paket-Archive. Und die werden für machen Plattformen komplett vorgebaut. Für andere (weil weniger populär oder beim Hersteller nicht vorhanden) muss dann ggf ein Compiler anspringen, damit dann ein lauffähige Installation draus wird. Warum auch immer das bei dir anschlägt, das hat was mit den Versionen des Paketes, als auch deines Systems zu tun.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Manchmal, zumindest bei älteren ``pip``-Versionen, werden Wheels einfach nur deswegen nicht heruntergeladen/benutzt weil das `wheels`-Package nicht installiert ist. Die waren ja mal eine “Erweiterung” bis sie quasi Standard wurden und jedes grössere Projekt welche anbietet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
PyGuest
User
Beiträge: 28
Registriert: Mittwoch 25. Mai 2022, 10:57

Und was muss ich tun, um pip dazu zu bekommen, die "wheels" zu benutzen und nicht zu versuchen, das alles selbst zu compilieren? Kann das mit dem "frischen" Python 12 zusammenhängen? Ist das in der 12 er Version vielleicht wieder herausgenommen worden?
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, damit kann das zutun haben. Und du kannst nichts tun, außer Randbedingungen zu schaffen, die eine Auswahl eines vorkompilierten Wheels Erlauben. Oder warten, bis ein solches für 3.12 verfügbar ist.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Python 3.10 ist die aktuellste Version, zu der es vorkompilierte Pakete gibt: https://pypi.org/project/cx-Oracle/#files
Es ist also nicht davon auszugehen, dass sich das nochmal ändert.
Antworten