MariaDB-Connector lässt sich nicht kompilieren

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
christoph-python
User
Beiträge: 5
Registriert: Freitag 4. Februar 2022, 10:44

Hallo zusammen,

dies ist mein erster Post in diesem Forum. Bitte weist mich darauf hin, wenn ich gegen irgendwelche Gepflogenheiten hier verstoße.

Ich versuche auf einer Windows 7-Maschine den MariaDB-Connector für Python zu installieren, scheitere aber daran, dass der gcc irgendetwas nicht linken möchte. Nur anhand der Fehlermeldung habe ich keine Ahnung, was ihm genau fehlt.

Code: Alles auswählen

PS C:\Users\[...]\Downloads\mariadb-connector-python-1.0.9> & 'C:\Users\[...]\.venv\bin\python.exe' setup.py build
Found MariaDB Connector/C in 'c:\Program Files\MariaDB\MariaDB Connector C 64-bit'
running build
running build_py
creating build
creating build\lib.mingw_x86_64_ucrt-3.9
creating build\lib.mingw_x86_64_ucrt-3.9\mariadb
copying mariadb\__init__.py -> build\lib.mingw_x86_64_ucrt-3.9\mariadb
creating build\lib.mingw_x86_64_ucrt-3.9\mariadb\constants
copying mariadb\constants\__init__.py -> build\lib.mingw_x86_64_ucrt-3.9\mariadb\constants
copying mariadb\constants\CLIENT.py -> build\lib.mingw_x86_64_ucrt-3.9\mariadb\constants
copying mariadb\constants\INDICATOR.py -> build\lib.mingw_x86_64_ucrt-3.9\mariadb\constants
copying mariadb\constants\CURSOR.py -> build\lib.mingw_x86_64_ucrt-3.9\mariadb\constants
copying mariadb\constants\FIELD_TYPE.py -> build\lib.mingw_x86_64_ucrt-3.9\mariadb\constants
running build_ext
building 'mariadb._mariadb' extension
creating build\temp.mingw_x86_64_ucrt-3.9
creating build\temp.mingw_x86_64_ucrt-3.9\mariadb
gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O2 -pipe -march=x86-64 -mtune=generic -O2 -pipe -DPY_MARIADB_MAJOR_VERSION=1 -DPY_MARIADB_MINOR_VERSION=0 -DPY_MARIADB_PATCH_VERSION=9 -I.\include -Ic:\Program Files\MariaDB\MariaDB Connector C 64-bit\include -Ic:\Program Files\MariaDB\MariaDB Connector C 64-bit\include\mysql -IC:\Users\[...]\.venv\include -IC:\msys64\ucrt64\include\python3.9 -c mariadb/mariadb.c -o build\temp.mingw_x86_64_ucrt-3.9\mariadb/mariadb.o /MD
gcc.exe: warning: /MD: linker input file unused because linking not done
gcc.exe: error: /MD: linker input file not found: No such file or directory
error: command 'C:\\msys64\\ucrt64\\bin\\gcc.exe' failed with exit code 1
Python version 3.9.7

MariaDB wird von pip als instaliert gemeldet, wird aber von Python während der Ausführung natürlich nicht gefunden:

Code: Alles auswählen

Package           Version
----------------- -------
mariadb           1.0.9
pip               22.0.3
pydantic          1.9.0
setuptools        57.4.0
typing_extensions 4.0.1

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\[...]\push-cdr-to-sql.py", line 8, in <module>
    import mariadb
ModuleNotFoundError: No module named 'mariadb'
Hat hier jemand einen Tipp für mich, was schief gelaufen ist?

Gruß
Christoph
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Der GCC-Aufruf vierte Zeile von unten enthält Pfade mit Leerzeichen die zumindest bei der Ausgabe dort nicht escaped oder gequoted sind. Beispielsweise ``-Ic:\Program Files\MariaDB\MariaDB Connector C 64-bit\include``.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Ist `/MD` nicht auch eine MSVC-Option? Die Fehlermeldung sieht zumindest so aus, als wenn GCC das als Dateiname interpretieren würde?

Gibt es einen Grund, warum du das selbst kompilieren willst? Warum nicht die Wheels von PyPI?
christoph-python
User
Beiträge: 5
Registriert: Freitag 4. Februar 2022, 10:44

narpfel hat geschrieben: Freitag 4. Februar 2022, 12:15 Ist `/MD` nicht auch eine MSVC-Option? Die Fehlermeldung sieht zumindest so aus, als wenn GCC das als Dateiname interpretieren würde?
Ja, das sieht so aus. Die Frage ist, warum Python dann den gcc als Compiler auswählt. Auf dem System ist auch ein Microsoft C++ Compiler installiert. Das \MD steht auf jeden Fall hardcoded in dem MariaDB-Connecter-Setup drin.
Gibt es einen Grund, warum du das selbst kompilieren willst? Warum nicht die Wheels von PyPI?
Ich habe mir den Source Code vom Connector runtergeladen, weil ich mir anschauen wollte, was dort passiert. Pip möchte das nämlich auch kompilieren. Keine Ahnung, warum es nicht die fertigen Binaries nutzen möchte.

Code: Alles auswählen

PS C:\Users\[...]> & '.venv\bin\python.exe' -m pip install mariadb
Collecting mariadb
  Using cached mariadb-1.0.9.zip (85 kB)
  Preparing metadata (setup.py): started
  Preparing metadata (setup.py): finished with status 'done'
Using legacy 'setup.py install' for mariadb, since package 'wheel' is not installed.
Installing collected packages: mariadb
  Running setup.py install for mariadb: started
  Running setup.py install for mariadb: finished with status 'error'
python.exe :   error: subprocess-exited-with-error
In Zeile:1 Zeichen:1
+ & '.venv\bin\python.exe' -m pip install mariadb
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (  error: subprocess-exited-with-error:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError


  Running setup.py install for mariadb did not run successfully.
  exit code: 1

  [22 lines of output]
  Found MariaDB Connector/C in 'c:\Program Files\MariaDB\MariaDB Connector C 64-bit'
  running install
  running build
  running build_py
  creating build
  creating build\lib.mingw_x86_64_ucrt-3.9
  creating build\lib.mingw_x86_64_ucrt-3.9\mariadb
  copying mariadb\__init__.py -> build\lib.mingw_x86_64_ucrt-3.9\mariadb
  creating build\lib.mingw_x86_64_ucrt-3.9\mariadb\constants
  copying mariadb\constants\__init__.py -> build\lib.mingw_x86_64_ucrt-3.9\mariadb\constants
  copying mariadb\constants\CLIENT.py -> build\lib.mingw_x86_64_ucrt-3.9\mariadb\constants
  copying mariadb\constants\INDICATOR.py -> build\lib.mingw_x86_64_ucrt-3.9\mariadb\constants
  copying mariadb\constants\CURSOR.py -> build\lib.mingw_x86_64_ucrt-3.9\mariadb\constants
  copying mariadb\constants\FIELD_TYPE.py -> build\lib.mingw_x86_64_ucrt-3.9\mariadb\constants
  running build_ext
  building 'mariadb._mariadb' extension
  creating build\temp.mingw_x86_64_ucrt-3.9
  creating build\temp.mingw_x86_64_ucrt-3.9\mariadb
  gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O2 -pipe -march=x86-64 -mtune=generic -O2 -pipe -DPY_MARIADB_MAJOR_VERSION=1
-DPY_MARIADB_MINOR_VERSION=0 -DPY_MARIADB_PATCH_VERSION=9 -I.\include -Ic:\Program Files\MariaDB\MariaDB Connector C 64-bit\include -Ic:\Program Files\MariaDB\MariaDB Connector
C 64-bit\include\mysql -IC:\Users\ruedig01\TK Elevator\DACH.DTX.PRODUCT - S24 CDR - S24 CDR\.venv\include -IC:\msys64\ucrt64\include\python3.9 -c mariadb/mariadb.c -o
build\temp.mingw_x86_64_ucrt-3.9\mariadb/mariadb.o /MD
  gcc.exe: warning: /MD: linker input file unused because linking not done
  gcc.exe: error: /MD: linker input file not found: No such file or directory
  error: command 'C:\\msys64\\ucrt64\\bin\\gcc.exe' failed with exit code 1
  [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: legacy-install-failure
Encountered error while trying to install package.
mariadb
note: This is an issue with the package mentioned above, not pip.
hint: See above for output from the failure.
christoph-python
User
Beiträge: 5
Registriert: Freitag 4. Februar 2022, 10:44

__blackjack__ hat geschrieben: Freitag 4. Februar 2022, 11:12 Der GCC-Aufruf vierte Zeile von unten enthält Pfade mit Leerzeichen die zumindest bei der Ausgabe dort nicht escaped oder gequoted sind. Beispielsweise ``-Ic:\Program Files\MariaDB\MariaDB Connector C 64-bit\include``.
Ich kann nicht alle Leerzeichen aus den Pfaden verbannen, da einige Pfade vorgegeben sind. Bei den Pfaden, wo ich die Leerzeichen verbannen konnte, gab es aber keine Änderung.

Hätte mich auch gewundert. Schließlich haben sich die 90er nicht bei mir gemeldet... :D
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Hm. Das ist natürlich schlau. Anscheinend ist es bei denen nicht vorgesehen, unter Windows mit GCC kompiliert zu werden.

Gibt es einen speziellen Grund, warum du ein MinGW- (bzw. MSYS2-) Python benutzt? Mit einem MSVC-Python sollte automatisch das Wheel benutzt werden können.
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Du könntest auch zunächst `wheel` installieren, denn "Using legacy 'setup.py install' for mariadb, since package 'wheel' is not installed." besagt ja, dass es nicht installiert ist.
christoph-python
User
Beiträge: 5
Registriert: Freitag 4. Februar 2022, 10:44

Ich habe jetzt ein "normales" Windows-Python von python.org runtergeladen und explizit damit mein venv angelegt. Dort dann wheel installiert und danach MariaDB. Jetzt funktioniert es.

Vielen Dank für die Hinweise!
christoph-python
User
Beiträge: 5
Registriert: Freitag 4. Februar 2022, 10:44

narpfel hat geschrieben: Freitag 4. Februar 2022, 12:41 Gibt es einen speziellen Grund, warum du ein MinGW- (bzw. MSYS2-) Python benutzt? Mit einem MSVC-Python sollte automatisch das Wheel benutzt werden können.
Nein, gibt es nicht. Das hat sich wohl einfach im PATH nach vorne gedrängelt.
Antworten