C中嵌入的python:有没有办法从压缩的python归档文件中正确导入numpy?
当使用包含所有python文件和二进制文件的本地.zip python文件而不是标准python安装时,似乎无法从嵌入python的C应用程序中正确导入numpy。这就是我得到的错误: zipimport:zlib可用C中嵌入的python:有没有办法从压缩的python归档文件中正确导入numpy?,c,python-2.7,numpy,C,Python 2.7,Numpy,当使用包含所有python文件和二进制文件的本地.zip python文件而不是标准python安装时,似乎无法从嵌入python的C应用程序中正确导入numpy。这就是我得到的错误: zipimport:zlib可用 python27.zip\Lib\site packages\numpy\u globals.pyc的mtime错误 zipimport:zlib可用 导入numpy._globals#从Zip python27.Zip\Lib\site packages\numpy_globa
python27.zip\Lib\site packages\numpy\u globals.pyc的mtime错误
zipimport:zlib可用
导入numpy._globals#从Zip python27.Zip\Lib\site packages\numpy_globals.py加载
zipimport:zlib可用
python27.zip\Lib\site packages\numpy\uuuuu config\uuuuu.pyc的mtime错误
zipimport:zlib可用
导入numpy.config#从Zip python27.Zip\Lib\site packages\numpy\uuuuuu config.py加载
zipimport:zlib可用
python27.zip\Lib\site packages\numpy\version.pyc的mtime错误
zipimport:zlib可用
导入numpy.version#从Zip python27.Zip\Lib\site packages\numpy\version.py加载
zipimport:zlib可用
python27.zip\Lib\site packages\numpy\u import\u tools.pyc的mtime错误
zipimport:zlib可用 导入numpy。_import_tools#从Zip python27.Zip\Lib\site packages\numpy_import_tools.py加载
zipimport:zlib可用
python27.zip\Lib\site packages\numpy\add\u newdocs.pyc的mtime错误
zipimport:zlib可用
zipimport:zlib可用
导入数学#内置
zipimport:zlib可用
导入numpy.lib.info#从Zip python27.Zip\lib\site packages\numpy\lib\info.pyc加载
zipimport:zlib可用
zipimport:zlib可用
zipimport:zlib可用
python27.zip\Lib\site packages\numpy\core\info.pyc的mtime错误
zipimport:zlib可用
导入numpy.core.info#从Zip python27.Zip\Lib\site packages\numpy\core\info.py加载
导入numpy.core#从Zip python27.Zip\Lib\site packages\numpy\core\uuuu init\uuuu.pyc加载
导入numpy.lib.type_check#从Zip python27.Zip\lib\site packages\numpy\lib\type_check.pyc加载
导入numpy.lib#从Zip python27.Zip\lib\site packages\numpy\lib\uuuu init\uuuuu.pyc加载
导入numpy.add_newdocs#从Zip python27.Zip\Lib\site packages\numpy\add_newdocs.py加载
导入numpy#从Zip python27.Zip\Lib\site packages\numpy\uuuu init\uuuuu.py加载
无法导入名称多数组 但当我提取上述.zip文件,运行python.exe解释器并导入numpy时,一切正常 我从源代码x86版本构建了Python2.7.13。之后,从安装了numpy-1.11.3+mkl-cp27-cp27m-win32.whl文件,然后制作了一个python.zip存档,其中包含所有必需的文件,并遵循通用文件夹结构 这就是我的C代码的样子:
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;
}
我正在执行的模块mod1.py包含以下内容:
import time
import json
import numpy
if __name__ == "__main__":
print 'Success'
我知道这个错误是因为python无法加载共享库multiarray.pyd。我需要在导入时单独处理这个场景吗?是否可以从C应用程序的非标准python压缩安装中正确导入numpy 编辑:忘记提及以下内容:
-我的操作系统是Windows 10 x64版本1511(操作系统版本10586.545)
-当我在我的C应用程序二进制文件所在的发布文件夹中提取.zip存档文件时,一切正常,numpy正确加载了以下sys.path
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path = ['.', 'DLLs', 'Lib', 'Lib\\site-packages', 'Sources']");
PyRun_SimpleString("print sys.path");
编辑2:另外,考虑检查python27.dll的确切版本,multiarray.pyd被链接到(根据其他关于类似问题的帖子),结果它与我的不同-它是2.7.8。没问题,从.msi包中提取了特定的python27.dll v2.7.8二进制文件,并替换了我的2.7.13二进制文件,但仍然不走运。它肯定是关于zipimport模块的
最好的方法可能是现在就将其解压缩。Python使用
zipimport
模块从zip文件加载模块,不幸的是,它不允许导入动态编译代码(可能是出于安全考虑,与以下内容一致):
zip存档中可能存在任何文件,但只有文件*.py和
.py[co]可供导入不允许动态模块(.pyd,*.so)的Zip导入
因为提供的控制盘将是平台控制盘,所以您还需要从.so文件名中删除平台扩展名,Cython将这些文件名添加到。也就是说,foo.cpython XYm.so
需要重命名为foo.so
。(因为您的问题是关于Python 2的,所以这不适用于Python 3,但它确实适用于Python 3)
最后,如果解压后的文件夹不在其上,则需要将其保存。您不能从zip文件加载共享库。这是操作系统的一个限制,适用于Windows、Linux和Mac OS。Python或其zip文件导入器没有问题。由于Numpy包含C扩展,您无法将其捆绑在zip可执行文件中。感谢您的回答,我已经通过艰苦的方式了解到了这一点。然而,我认为我是通过利用Joachim Bauch编写的MemoryModule lib将存档解压缩到内存中并从那里加载内容而成功的(成功的)。这里的示例代码:(警告:由于我还在学习C语言,所以编写的库很糟糕,代码也很混乱)有趣的是,我最终为Linux做了类似的事情;从概念上讲,它是一个包装器,将二进制文件复制到/tmp中的一个文件夹中,将文件夹添加到
sys.path
中,并从mymodule import*中evals加载扩展。我不知道这个加载程序。啊,对不起@JasonArg123,我已经从github迁移了所有的内容,可能是ave在这个过程中删除了过时的回购协议。一旦我找到了来源,我将把它上传到gitlab@JasonArg123是我找到的旧回购协议如果你想