在windows上使用boost.python时,有没有办法只按需加载pythonXX.dll?

在windows上使用boost.python时,有没有办法只按需加载pythonXX.dll?,windows,dll,wrapper,ctypes,boost-python,Windows,Dll,Wrapper,Ctypes,Boost Python,我有一个C API DLL,是我们为一个USB产品创建的,我想如果能够使用python导入,而不使用任何包装函数(如ctypes),那会很好。我们的DLL已经与boost和C运行时静态链接,用于其他功能,没有任何问题。添加任何导出的python函数后,如以下简单测试: #include <boost/python.hpp> char const* greet() { return "hello, world"; } BOOST_PYTHON_MODULE(mymodule)

我有一个C API DLL,是我们为一个USB产品创建的,我想如果能够使用python导入,而不使用任何包装函数(如ctypes),那会很好。我们的DLL已经与boost和C运行时静态链接,用于其他功能,没有任何问题。添加任何导出的python函数后,如以下简单测试:

#include <boost/python.hpp>

char const* greet()
{
   return "hello, world";
}

BOOST_PYTHON_MODULE(mymodule)
{
    using namespace boost::python;
    def("greet", greet);
}
#包括
字符常量*greet()
{
返回“你好,世界”;
}
BOOST_PYTHON_模块(mymodule)
{
使用名称空间boost::python;
def(“问候”,问候);
}
现在构建的DLL在加载时依赖于python34.DLL。通常情况下,这很好,但现实情况是,我们的DLL的大多数用户目前不打算使用python功能。我希望发生的是,只有当模块被python加载时,或者当python函数第一次被调用时,才具有这种依赖关系。这样,只有python用户才需要python DLL,我们的DLL在没有python代码加载时,在缺少python DLL的系统上加载时不会出错

我能想到的解决方案是为python用户创建一个单独的DLL,它要么调用我们的DLL,要么包含它的所有功能。如果可能的话,我宁愿只使用一个二进制文件。一旦涉及到两个或多个文件,我就质疑仅仅分发使用ctypes用python编写的包装器的价值


在我自己的Windows C/C++代码中,我总是按需加载任何我可以加载的DLL,这样我就可以更好地向用户报告错误,如果程序不存在的话,我还可以允许程序在功能受损的情况下运行。我有点惊讶于boost.python在加载时就引入了python34.dll。

请将python链接为一个。我不是加载python dll的人—boost.python是。我知道如何延迟加载DLL,但我想知道是否可以让boost.python在不重写的情况下完成这项工作。目前,链接到boost.python会在加载时创建一个pythonXX.dll依赖项,即使dll是由非python应用程序加载的。您所要求的可能是不可能的。Python旨在扩展和嵌入Python,因此在启动时可能需要Python的C API。在这种情况下,构建一个单独的Python扩展来链接到您的DLL是一种方法。另外,在我看来,最好使用.pyd文件扩展名作为扩展模块。Python的导入系统不查找.dll文件(与Linux上的.so文件不同),因此您必须使用
imp.load_dynamic
(或使用importlib——获取加载程序和规范,然后创建并执行模块)手动加载.dll。请将Python链接为一个模块。我不是加载Python dll的人-boost.Python是。我知道如何延迟加载DLL,但我想知道是否可以让boost.python在不重写的情况下完成这项工作。目前,链接到boost.python会在加载时创建一个pythonXX.dll依赖项,即使dll是由非python应用程序加载的。您所要求的可能是不可能的。Python旨在扩展和嵌入Python,因此在启动时可能需要Python的C API。在这种情况下,构建一个单独的Python扩展来链接到您的DLL是一种方法。另外,在我看来,最好使用.pyd文件扩展名作为扩展模块。Python的导入系统不查找.dll文件(与Linux上的.so文件不同),因此您必须使用
imp.load\u dynamic
(或使用importlib——获取加载程序和规范,然后创建并执行模块)手动加载.dll。