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. .