使用vcpkg在c++中运行嵌入式Python进行安装



我不知道如何通过vcpkg安装python。我拥有的CMakesLists文件是:

cmake_minimum_required(VERSION 3.8)
if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
set(CMAKE_TOOLCHAIN_FILE "./vcpkg/scripts/buildsystems/vcpkg.cmake"
CACHE STRING "")
endif()
project(test)
find_package(Python3 COMPONENTS Development REQUIRED)
add_executable(test test.cpp)
target_link_libraries(test PRIVATE Python3::Python)

c++文件直接取自https://docs.python.org/3/extending/embedding.html#very-高级嵌入

所有的编译和链接都没有错误,但执行时会出现以下错误:

Python path configuration:
PYTHONHOME = (not set)
PYTHONPATH = (not set)
program name = 'C:UserssmithOneDriveDesktopOSUvcpkg-python-testbuildDebugtest.exe'
isolated = 0
environment = 1
user site = 1
import site = 1
sys._base_executable = 'C:\Users\smith\OneDrive\Desktop\OSU\vcpkg-python-test\build\Debug\test.exe'
sys.base_prefix = ''
sys.base_exec_prefix = ''
sys.platlibdir = 'lib'
sys.executable = 'C:\Users\smith\OneDrive\Desktop\OSU\vcpkg-python-test\build\Debug\test.exe'      
sys.prefix = ''
sys.exec_prefix = ''
sys.path = [
'C:\Users\smith\OneDrive\Desktop\OSU\vcpkg-python-test\build\Debug\python310_d.zip',
'.\DLLs',
'.\lib',
'C:\Users\smith\OneDrive\Desktop\OSU\vcpkg-python-test\build\Debug',
]
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'

Current thread 0x000062bc (most recent call first):
<no Python frame>

我不明白我做错了什么,也不明白我是否错过了某一步。

完整的示例代码可在https://github.com/Drew-j-Smith/vcpkg-python-test

这是在windows 10 上运行的

编辑:

将其添加到CMakeLists.txt(在找到python之后(:

get_filename_component(Python3_EXECUTABLE_DIR ${Python3_EXECUTABLE} DIRECTORY)
add_definitions(-DPYTHON_LIB=L"${Python3_EXECUTABLE_DIR}/Lib")

并呼叫

Py_SetPath(PYTHON_LIB);

在初始化python之前确实解决了这个问题。然而,这在我看来像是一个黑客。我仍在寻找一个稳健的解决方案。

经过大量的尝试和错误,解决方案是在可执行文件的目录中创建一个虚拟环境。

这种行为在我看来很奇怪,但在这里有记录:https://docs.python.org/3/c-api/intro.html#embedding-python

示例解决方案是将其添加到CMakeLists.txt 的末尾

if(WIN32)
add_custom_command(TARGET test POST_BUILD 
COMMAND ${Python3_EXECUTABLE} -m venv $<TARGET_FILE_DIR:test>/..
COMMAND $<TARGET_FILE_DIR:test>/../Scripts/activate.bat
COMMAND python -m pip install -r ${CMAKE_SOURCE_DIR}/requirements.txt > pip_install.log)
else()
add_custom_command(TARGET test POST_BUILD 
COMMAND ${Python3_EXECUTABLE} -m venv $<TARGET_FILE_DIR:test>/..
COMMAND $<TARGET_FILE_DIR:test>/../Scripts/activate
COMMAND python -m pip install -r ${CMAKE_SOURCE_DIR}/requirements.txt > pip_install.log)
endif()

这将安装所需的任何软件包,并为可执行文件创建一个虚拟环境,以便它知道python的路径。

编辑:

我在调试模式下运行时遇到了一些问题。当试图导入numpy时,由于缺少调试二进制文件,我不得不使用发布模式。

最新更新