Embedded Python ne fonctionne pas, pointer vers Python35.zip avec NumPy – comment réparer

Ok, voici l’exemple de base du site Web Python pour un simple runpy.exe permettant d’exécuter les scripts Python ci-dessous. Cela fonctionne correctement avec Visual Studio 2015 sous Windows x64 après avoir référencé les éléments inclus dans Python et python35.lib liaison avec python35.lib pour les fonctions de base (la documentation ne mentionne pas que pyvenv.cfg doit se trouver dans le répertoire EXE). Cependant, appeler un script qui importe NumPy entraîne l’erreur ImportError: No module named 'numpy' Failed to load "eig" uniquement lors de l’utilisation de python35.zip incorporé. Comment inclure NumPy dans un EXE Python incorporé? C’est-à-dire que je veux aussi “incorporer” NumPy (en tant que .zip, répertoire, .dll ou .pyd, etc.). J’ai essayé d’append les éléments NumPy et de npymath.lib lien vers npymath.lib mais la même erreur d’importation se produit. J’ai également fouillé dans du code wrapper Cython mais je n’ai pas trouvé de solution. Voici l’exemple de code intégré à Python:

 #include  #include  int main(int argc, char *argv[]) { PyObject *pName, *pModule, *pDict, *pFunc; PyObject *pArgs, *pValue; int i; if (argc < 3) { fprintf(stderr, "Usage: runpy pythonfile funcname [args]\n"); return 1; } Py_SetPath(L"python35.zip"); //this is in the current directory Py_Initialize(); pName = PyUnicode_DecodeFSDefault(argv[1]); /* Error checking of pName left out */ pModule = PyImport_Import(pName); Py_DECREF(pName); if (pModule != NULL) { pFunc = PyObject_GetAttrString(pModule, argv[2]); /* pFunc is a new reference */ if (pFunc && PyCallable_Check(pFunc)) { pArgs = PyTuple_New(argc - 3); for (i = 0; i < argc - 3; ++i) { pValue = PyLong_FromLong(atoi(argv[i + 3])); if (!pValue) { Py_DECREF(pArgs); Py_DECREF(pModule); fprintf(stderr, "Cannot convert argument\n"); return 1; } /* pValue reference stolen here: */ PyTuple_SetItem(pArgs, i, pValue); } pValue = PyObject_CallObject(pFunc, pArgs); Py_DECREF(pArgs); if (pValue != NULL) { printf("Result of call: %ld\n", PyLong_AsLong(pValue)); Py_DECREF(pValue); } else { Py_DECREF(pFunc); Py_DECREF(pModule); PyErr_Print(); fprintf(stderr, "Call failed\n"); return 1; } } else { if (PyErr_Occurred()) PyErr_Print(); fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]); } Py_XDECREF(pFunc); Py_DECREF(pModule); } else { PyErr_Print(); fprintf(stderr, "Failed to load \"%s\"\n", argv[1]); return 1; } Py_Finalize(); return 0; } 

Le fichier python35.zip est ici: https://www.python.org/ftp/python/3.5.2/python-3.5.2-embed-amd64.zip , python35.zip à l’intérieur de l’archive. Voici le script de test simple ( runpy eig eig 10 à tester – remarque si vous Python35.zip pas Python35.zip et que NumPy / SciPy installe pas, il s’exécutera):

eig.py

 import numpy as np from scipy import linalg def eig(a): c = np.random.rand(a,a)*100 c = np.corrcoef(c) print('You are taking the eigsh of a ', a, '^2 masortingx') e, f = linalg.eig(c) return print('Eigvals are: ',np.diag(f)) 

Quelqu’un sait comment résoudre ce problème? Très appréciée.

Mise à jour: Voici la version compilée x64 Python 3.5 Windows NumPy SciPy et Pandas avec Intel MKL inclus: https://www.dropbox.com/sh/2smbgen2i9ilf2e/AADI8A3pCAFU-EqNLTbOiUwJa?dl=0

Cela ne fonctionne pas car numpy n’est pas dans le fichier python35.zip . Le programme runpy définit le chemin d’access à python35.zip : il s’agit donc du seul chemin dans le chemin Python pour cette exception de programme … Vous devez également append le dossier parent de votre dossier numpy local au chemin Python pour le faire fonctionner. .