Python 无法加载 boost.python dll
Python failing to load boost.python dll
我在使用简单的提升 python 设置时遇到了一些问题。
我见过很多其他人遇到过问题,但其中 none 似乎与我的问题相同,因为他们的 none 解决方案有效。
作为参考,我在 windows 10,使用 mingw64 10.2 作为我的 c++ 编译器的 msys2 的一部分。我使用该编译器构建了 boost 以进行调试和优化,并且我还使用该编译器构建了一个针对 boost.python 的 dll 链接。
我的 Cmake 文件:
cmake_minimum_required(VERSION 3.20)
project(test)
set(CMAKE_CXX_STANDARD 20)
find_package(Python3 REQUIRED COMPONENTS Interpreter Development)
include_directories(${Python3_INCLUDE_DIRS})
set(Boost_ARCHITECTURE -x64)
set(Boost_NO_WARN_NEW_VERSIONS ON)
# set(Boost_DEBUG ON)
set(Boost_INCLUDE_DIR "C:/Devel/install/include/boost-1_76")
set(Boost_LIBRARY_DIR "C:/Devel/install/lib")
SET(Boost_USE_STATIC_LIBS OFF)
SET(Boost_USE_STATIC_RUNTIME OFF)
add_definitions("-DBOOST_ALL_DYN_LINK")
add_definitions("-DBOOST_UUID_USE_SSE2")
add_definitions("-DBOOST_UUID_USE_SSE3")
add_definitions("-DBOOST_PYTHON_STATIC_LIB")
SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/Devel/install/include")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/Devel/install/lib")
find_package(Boost 1.76.0 REQUIRED COMPONENTS python39)
include_directories(${Boost_INCLUDE_DIRS})
file(GLOB_RECURSE PythonBindings_SOURCES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/PythonBindings/*.cpp")
add_library(PythonBindings SHARED ${PythonBindings_SOURCES})
target_link_libraries(PythonBindings Boost::python39 Python3::Module)
set_target_properties(PythonBindings PROPERTIES LINKER_LANGUAGE CXX PREFIX "" SUFFIX ".pyd" IMPORT_PREFIX "" IMPORT_SUFFIX ".pyd.a")
target_compile_definitions(PythonBindings PRIVATE EXPORT_PYTHONBINDINGS)
Cpp 文件:
#include <boost/python.hpp>
char const*
helloWorld()
{
return "Hello, world!";
}
using namespace boost::python;
BOOST_PYTHON_MODULE(PythonBindings)
{
def("hello_world", helloWorld);
}
这成功编译为 'PythonBindings.pyd'。在 dependency walker 中打开它,我可以看到它导出符号 'PyInit_PythonBindings'
当我尝试使用来自 python (python -vv py/helloworld.py
)
的这个 dll 时
import PythonBindings;
PythonBindings.hello_world()
我得到:
Traceback (most recent call last):
File "C:\Devel\Working\test\py\helloworld.py", line 18, in <module>
import PythonBindings;
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 666, in _load_unlocked
File "<frozen importlib._bootstrap>", line 565, in module_from_spec
File "<frozen importlib._bootstrap_external>", line 1173, in create_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
ImportError: DLL load failed while importing PythonBindings: The specified module could not be found.
我不确定是什么问题。我的 $PATH 变量包含 PythonBindings.pyd (libboost_python39-mgw10-mt-x64-1_76.dll, kernel32.dll, MSVCRT.dll, libgcc_s_seh-[=42] 的所有依赖项的搜索路径=], libstdc++-6.dll, python39.dll)
我将 dll 命名为与 python 模块相同的名称,我知道有些人已经把它们搞砸了,我使用相同的 c++ 编译器和 python 版本来构建 boost 和我的库,并且我使用相同的 python 版本来链接这两个版本,就像我为 运行 我的 python 脚本所做的那样。
我完全不知道如何解决这个问题。
我按照教程 here 遵循了 doqtor 的评论,发现问题是 python 没有加载几个 dll,这些 dll 是 PythonBindings.pyd.
的运行时依赖项
这是通过添加
解决的
import sys
import os
[os.add_dll_directory(dir) for dir in sys.path if os.path.isdir(dir)]
之前 import PythonBindings
我很奇怪 python 没有搜索 sys.path dll 依赖项。它需要搜索的路径也在 os.environ['PATH'] 上,但它再次没有搜索它们。我不确定是否有更好的方法来做到这一点。有的话想听听
我在使用简单的提升 python 设置时遇到了一些问题。 我见过很多其他人遇到过问题,但其中 none 似乎与我的问题相同,因为他们的 none 解决方案有效。 作为参考,我在 windows 10,使用 mingw64 10.2 作为我的 c++ 编译器的 msys2 的一部分。我使用该编译器构建了 boost 以进行调试和优化,并且我还使用该编译器构建了一个针对 boost.python 的 dll 链接。
我的 Cmake 文件:
cmake_minimum_required(VERSION 3.20)
project(test)
set(CMAKE_CXX_STANDARD 20)
find_package(Python3 REQUIRED COMPONENTS Interpreter Development)
include_directories(${Python3_INCLUDE_DIRS})
set(Boost_ARCHITECTURE -x64)
set(Boost_NO_WARN_NEW_VERSIONS ON)
# set(Boost_DEBUG ON)
set(Boost_INCLUDE_DIR "C:/Devel/install/include/boost-1_76")
set(Boost_LIBRARY_DIR "C:/Devel/install/lib")
SET(Boost_USE_STATIC_LIBS OFF)
SET(Boost_USE_STATIC_RUNTIME OFF)
add_definitions("-DBOOST_ALL_DYN_LINK")
add_definitions("-DBOOST_UUID_USE_SSE2")
add_definitions("-DBOOST_UUID_USE_SSE3")
add_definitions("-DBOOST_PYTHON_STATIC_LIB")
SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/Devel/install/include")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/Devel/install/lib")
find_package(Boost 1.76.0 REQUIRED COMPONENTS python39)
include_directories(${Boost_INCLUDE_DIRS})
file(GLOB_RECURSE PythonBindings_SOURCES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/PythonBindings/*.cpp")
add_library(PythonBindings SHARED ${PythonBindings_SOURCES})
target_link_libraries(PythonBindings Boost::python39 Python3::Module)
set_target_properties(PythonBindings PROPERTIES LINKER_LANGUAGE CXX PREFIX "" SUFFIX ".pyd" IMPORT_PREFIX "" IMPORT_SUFFIX ".pyd.a")
target_compile_definitions(PythonBindings PRIVATE EXPORT_PYTHONBINDINGS)
Cpp 文件:
#include <boost/python.hpp>
char const*
helloWorld()
{
return "Hello, world!";
}
using namespace boost::python;
BOOST_PYTHON_MODULE(PythonBindings)
{
def("hello_world", helloWorld);
}
这成功编译为 'PythonBindings.pyd'。在 dependency walker 中打开它,我可以看到它导出符号 'PyInit_PythonBindings'
当我尝试使用来自 python (python -vv py/helloworld.py
)
import PythonBindings;
PythonBindings.hello_world()
我得到:
Traceback (most recent call last):
File "C:\Devel\Working\test\py\helloworld.py", line 18, in <module>
import PythonBindings;
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 666, in _load_unlocked
File "<frozen importlib._bootstrap>", line 565, in module_from_spec
File "<frozen importlib._bootstrap_external>", line 1173, in create_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
ImportError: DLL load failed while importing PythonBindings: The specified module could not be found.
我不确定是什么问题。我的 $PATH 变量包含 PythonBindings.pyd (libboost_python39-mgw10-mt-x64-1_76.dll, kernel32.dll, MSVCRT.dll, libgcc_s_seh-[=42] 的所有依赖项的搜索路径=], libstdc++-6.dll, python39.dll)
我将 dll 命名为与 python 模块相同的名称,我知道有些人已经把它们搞砸了,我使用相同的 c++ 编译器和 python 版本来构建 boost 和我的库,并且我使用相同的 python 版本来链接这两个版本,就像我为 运行 我的 python 脚本所做的那样。
我完全不知道如何解决这个问题。
我按照教程 here 遵循了 doqtor 的评论,发现问题是 python 没有加载几个 dll,这些 dll 是 PythonBindings.pyd.
的运行时依赖项这是通过添加
解决的import sys
import os
[os.add_dll_directory(dir) for dir in sys.path if os.path.isdir(dir)]
之前 import PythonBindings
我很奇怪 python 没有搜索 sys.path dll 依赖项。它需要搜索的路径也在 os.environ['PATH'] 上,但它再次没有搜索它们。我不确定是否有更好的方法来做到这一点。有的话想听听