Eingebettetes Python in C: Gibt es eine Möglichkeit, numpy ordnungsgemäß aus einem gezippten Python-Archiv zu importieren?

Lesezeit: 6 Minuten

Benutzer-Avatar
civa

Anscheinend kann ich numpy nicht richtig aus der C-Anwendung importieren, die Python einbettet, wenn ich eine lokale .zip-Python-Datei verwende, die alle Python-Dateien und Binärdateien enthält, anstatt die Standard-Python-Installation. Dies ist der Fehler, den ich bekomme:

zipimport: zlib verfügbar
python27.zip\Lib\site-packages\numpy_globals.pyc hat eine schlechte mtime
zipimport: zlib verfügbar
import numpy._globals # geladen aus Zip python27.zip\Lib\site-packages\numpy_globals.py
zipimport: zlib verfügbar
python27.zip\Lib\site-packages\numpy__config__.pyc hat eine schlechte Zeit
zipimport: zlib verfügbar
importiere numpy.Konfig # geladen aus Zip python27.zip\Lib\site-packages\numpy__config__.py
zipimport: zlib verfügbar
python27.zip\Lib\site-packages\numpy\version.pyc hat eine schlechte mtime
zipimport: zlib verfügbar
import numpy.version # geladen aus Zip python27.zip\Lib\site-packages\numpy\version.py
zipimport: zlib verfügbar
python27.zip\Lib\site-packages\numpy_import_tools.pyc hat eine schlechte Zeit
zipimport: zlib verfügbar import numpy._import_tools # geladen aus Zip python27.zip\Lib\site-packages\numpy_import_tools.py
zipimport: zlib verfügbar
python27.zip\Lib\site-packages\numpy\add_newdocs.pyc hat eine schlechte mtime
zipimport: zlib verfügbar
zipimport: zlib verfügbar
import math # builtin
zipimport: zlib verfügbar
import numpy.lib.info # geladen aus Zip python27.zip\Lib\site-packages\numpy\lib\info.pyc
zipimport: zlib verfügbar
zipimport: zlib verfügbar
zipimport: zlib verfügbar
python27.zip\Lib\site-packages\numpy\core\info.pyc hat eine schlechte mtime
zipimport: zlib verfügbar
import numpy.core.info # geladen aus Zip python27.zip\Lib\site-packages\numpy\core\info.py
import numpy.core # geladen aus Zip python27.zip\Lib\site-packages\numpy\core__init__.pyc
import numpy.lib.type_check # geladen aus Zip python27.zip\Lib\site-packages\numpy\lib\type_check.pyc
import numpy.lib # geladen aus Zip python27.zip\Lib\site-packages\numpy\lib__init__.pyc
import numpy.add_newdocs # geladen aus Zip python27.zip\Lib\site-packages\numpy\add_newdocs.py
import numpy # geladen aus Zip python27.zip\Lib\site-packages\numpy__init__.py
Name Multiarray kann nicht importiert werden

Aber wenn ich die oben genannte .zip-Datei extrahiere und den python.exe-Interpreter ausführe und numpy importiere, funktioniert alles einwandfrei.

Ich habe Python 2.7.13 aus der Quelle x86 Release erstellt. Danach installiert numpy-1.11.3+mkl-cp27-cp27m-win32.whl Datei aus hiererstellte dann ein Python-ZIP-Archiv mit allen erforderlichen Dateien gemäß der gemeinsamen Ordnerstruktur.

So sieht mein C-Code aus:

int main(int argc, char **argv)
{
    Py_VerboseFlag++;
    Py_NoSiteFlag++;

    Py_SetProgramName(argv[0]);
    Py_SetPythonHome(".");

    Py_Initialize();

    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path = ['.','python27.zip','python27.zip/DLLs','python27.zip/Lib', 'python27.zip/Lib/site-packages']");;
    PyRun_SimpleString("print sys.path");

    printf("\n");

    char filename[_MAX_PATH];
    _fullpath(filename, "mod1.py", _MAX_PATH);

    PyObject* main_module = PyImport_AddModule("__main__");
    PyObject* main_dict = PyModule_GetDict(main_module);
    PyObject *pyFileObj = PyFile_FromString(filename, "r");

    if (pyFileObj == NULL) {
        return -1;
    }

    FILE *pFile = PyFile_AsFile(pyFileObj);

    if (pFile == NULL)
        return -1;

    PyObject *result = PyRun_File(pFile, filename, Py_file_input, main_dict, main_dict);

    if (!result)
        print_error();

    printf("\n\n");


    Py_Finalize();
    getchar();

    return 0;
}

Modul mod1.py, das ich ausführe, enthält Folgendes:

import time
import json
import numpy

if __name__ == "__main__":
    print 'Success'

Mir ist bewusst, dass dieser Fehler darauf zurückzuführen ist, dass Python nicht geladen werden kann multiarray.pyd Dies ist eine gemeinsam genutzte Bibliothek. Muss ich dieses Szenario beim Importieren separat handhaben?
Ist es möglich, numpy ordnungsgemäß aus einer gezippten, nicht standardmäßigen Python-Installation aus einer C-Anwendung zu importieren?

BEARBEITEN : Folgendes vergessen zu erwähnen:
– Mein Betriebssystem ist Windows 10 x64 Version 1511 (BS-Build 10586.545)

– Wenn ich das .zip-Archiv in meinen Release-Ordner entpacke, in dem sich meine C-App-Binärdatei befindet, funktioniert alles einwandfrei, numpy wird ordnungsgemäß geladen, wobei Folgendes folgt sys.Pfad

PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path = ['.', 'DLLs', 'Lib', 'Lib\\site-packages', 'Sources']");
PyRun_SimpleString("print sys.path");

BEARBEITEN 2: Auch gedacht, um die genaue Version von zu überprüfen python27.dll das multiarray.pyd ist verlinkt (laut anderen Beiträgen über ähnliche Probleme) und es stellte sich heraus, dass es anders ist als meins – es ist 2.7.8. Kein Problem, extrahierte eine bestimmte python27.dll v2.7.8-Binärdatei aus dem .msi-Paket und ersetzte meine, die 2.7.13 war, aber immer noch kein Glück. Es geht definitiv um etwas zipimport Modul.

Geben Sie hier die Bildbeschreibung ein

  • Sie können eine gemeinsam genutzte Bibliothek nicht aus einer ZIP-Datei laden. Dies ist eine Einschränkung des Betriebssystems und gilt für Windows, Linux und Mac OS. Es ist kein Problem mit Python oder seinem Zip-Datei-Importer. Da Numpy C-Erweiterungen enthält, können Sie es nicht in einer ausführbaren ZIP-Datei bündeln.

    – JacaByte

    18. Februar 2018 um 23:23 Uhr

  • Danke für die Antwort, ich habe das bereits auf die harte Tour gelernt. Ich glaube jedoch, ich habe es (unter Win) geschafft, indem ich die von Joachim Bauch geschriebene MemoryModule-Bibliothek verwendet habe, indem ich einfach das Archiv in den Speicher dekomprimiert und von dort geladen habe. Beispielcode hier: github.com/Civa/continuum/blob/master/src/continuum/runtime/… (WARNUNG: schlecht geschriebene Bibliothek mit chaotischem Code, da ich immer noch C lerne)

    – civa

    19. Februar 2018 um 19:56 Uhr

  • Interessanterweise habe ich am Ende etwas Ähnliches für Linux gemacht; konzeptionell ist es ein Wrapper, der die Binärdatei in einen Ordner in /tmp kopiert und den Ordner hinzufügt sys.path und Bewertungen from mymodule import * um die Erweiterung zu laden. Ich kannte diesen Lader noch nicht.

    – JacaByte

    20. Februar 2018 um 3:33 Uhr


  • ah sorry @ JasonArg123, ich habe alle Sachen von github migriert und dabei möglicherweise veraltete Repos gelöscht. Sobald ich die Quelle finde, werde ich sie ins Gitlab hochladen

    – civa

    4. Juni 2020 um 10:00 Uhr


  • @JasonArg123 hier ist das alte Repo, das ich gefunden habe. Wenn Sie sehen möchten, wie der Loader funktioniert, suchen Sie einfach nach loader.c. Beachten Sie, dass dieser Code SEHR chaotisch ist. Da dies für Windows geschrieben wurde, kann ich nicht viel helfen, da ich vor langer Zeit auf LInux umgestiegen bin, sorry. Bitte zögern Sie nicht, mit dem Code alles zu tun, was Sie wollen, da keine Lizenz angehängt ist. Ich hoffe, Sie werden es nützlich finden. Tschüss, civa

    – civa

    17. Februar 2021 um 12:24 Uhr

Benutzer-Avatar
Alex W

Der beste Weg ist wahrscheinlich, es vorerst zu entpacken. Das zipimport module ist das, was Python verwendet, um Module aus ZIP-Dateien zu laden, und leider verbietet es den Import von dynamisch kompiliertem Code (wahrscheinlich aus Sicherheitsgründen, im Einklang mit PEP 273):

Im Zip-Archiv können beliebige Dateien vorhanden sein, aber nur Dateien *.py und
.py[co] sind für den Import verfügbar. Zip-Import dynamischer Module (.pyd, *.so) ist nicht erlaubt.

Da es sich bei den bereitgestellten Rädern um Plattformräder handelt, müssen Sie auch die Plattformerweiterung aus den .so-Dateinamen entfernen, die von Cython als Teil der Einhaltung hinzugefügt werden PEP 3149. Dh, foo.cpython-XYm.so müsste umbenannt werden in foo.so. (Da Ihre Frage nach Python 2 fragt, gilt dies nicht, aber es gilt für Python 3)

Zuletzt müssen die entpackten Ordner zum PYTHONPATH hinzugefügt werden, falls sie sich nicht bereits darin befinden.

  • danke für die Antwort, aber ich habe dieses Projekt schon vor langer Zeit aufgegeben.

    – civa

    1. April 2021 um 21:38 Uhr

  • Kein Problem, hatte dieses Problem auf dem Spark-Cluster, also habe ich eine eingehende Untersuchung durchgeführt und wollte, dass andere es nicht müssen

    – Alex W

    2. April 2021 um 14:23 Uhr

1291220cookie-checkEingebettetes Python in C: Gibt es eine Möglichkeit, numpy ordnungsgemäß aus einem gezippten Python-Archiv zu importieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy