C中嵌入的python:有没有办法从压缩的python归档文件中正确导入numpy?

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

当使用包含所有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_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是我找到的旧回购协议如果你想