嵌入Python+Numpy时延迟加载Python DLL

8
我正在构建一个C++应用程序,将调用Python + NumPy,并希望延迟加载Python DLL。我在Windows上使用64位Python 3.6和Visual Studio 2015。只要我不使用NumPy,DELAYLOAD就能正常工作。一旦我调用import_array(),我就不能再使用DELAYLOAD选项进行构建。链接器错误为:

LNK1194 由于导入数据符号'__imp_PyExc_ImportError',无法延迟加载'python36.dll';请在没有/DELAYLOAD:python36.dll的情况下进行链接。

这是我的代码:

// Initialize python
Py_Initialize();

// If I remove this line, I am able to build with DELAYLOAD
import_array();

有没有办法在使用numpy时实现延迟加载?
或者说,有没有办法在不调用import_array()的情况下创建并填充数据到numpy.recarray中?
编辑:我决定摆脱import_array()。 这是我用来初始化Python的一些代码:
    if (!Py_IsInitialized())
    {
        // Initialize Python
        Py_Initialize();

        // Initialize threads
        PyEval_InitThreads();

        // Needed for datetime
        PyDateTime_IMPORT;

        // Needed to avoid use of Py_None, Py_True, and Py_False;
        // which cause inability to use DELAYLOAD
        HMODULE pythonDll = GetModuleHandle(L"python36.dll");
        if (pythonDll == nullptr)
        {
            throw gcnew NotSupportedException(L"GS_ERR_CannotInitialize");
        }
        PythonHelper::_pyNone = (PyObject*)GetProcAddress(pythonDll, "_Py_NoneStruct");
        PythonHelper::_pyTrue = (PyObject*)GetProcAddress(pythonDll, "_Py_TrueStruct");
        PythonHelper::_pyFalse = (PyObject*)GetProcAddress(pythonDll, "_Py_FalseStruct");
    }

你尝试过Release/Debug两种构建变体吗?有时候这会有所帮助。 - fghj
很遗憾,我找不到numpy的Debug版本,所以只能使用Release LIB / DLL。 - Andrey Belykh
您可以注册beta版ifort编译器,该编译器已经可用了几个月。 - denfromufa
你是在编写扩展模块,还是将Python嵌入到应用程序中?这可能与你的问题无关,但你是否记得在任何标准头文件之前包含Python.h - sancho.s ReinstateMonicaCellio
我正在将Python嵌入应用程序中。这是我的包含文件:#pragma unmanaged #include #include "Python.h" #include "datetime.h" #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION #include "numpy/arrayobject.h" #pragma managed #include - Andrey Belykh
显示剩余2条评论
2个回答

1

在使用numpy时是否有办法实现延迟加载?

您可能无法在import_array中使用DELAYLOAD

  1. 如果从DLL中导入数据,则无法延迟加载(官方文档)。

  2. import_array导入存储函数指针表的模块,并将正确的变量指向它(官方文档)。

我猜你正在处理导出类和导出数据成员的情况。请参考this, thisthis了解更多信息。

请问您能否提供一个官方文档链接,证明numpy不可能实现这个功能。 - Andrey Belykh
@AndreyBelykh - Numpy文档可能不会提及与特定链接器+标志链接的问题,因为那会太具体了。但我已更新答案,附上了MSVS + numpy的官方文档,可以得出结论。 - sancho.s ReinstateMonicaCellio
谢谢。看起来我将不得不避免使用import_array()。 - Andrey Belykh

0

这可能也是由于优化引起的,可以在这里看到。

你也可以尝试在项目设置中删除未引用的代码和数据


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接