CMake - 设置Python虚拟环境

16

我希望我的项目能够使用cmake设置虚拟环境来运行Python代码。此操作通常是否执行?或者我应该默认使用全局Python环境?


3
这个 Gist https://gist.github.com/mjkillough/630ef274387429680577963f630b2691 展示了“从 CMake 生成和使用 virtualenv”的过程。 - drizzd
1个回答

4
链接的代码片段可以运行。
cmake_minimum_required(VERSION 3.6)

project(CmakeVirtualenv)

enable_testing()

# Find Python and Virtualenv. We don't actually use the output of the
# find_package, but it'll give nicer errors.
find_package(PythonInterp 2.7 REQUIRED)
find_program(VIRTUALENV virtualenv)
if(NOT VIRTUALENV)
    message(FATAL_ERROR "Could not find `virtualenv` in PATH")
endif()
set(VIRTUALENV ${VIRTUALENV} -p python2.7)

# Generate the virtualenv and ensure it's up to date.
add_custom_command(
    OUTPUT venv
    COMMAND ${VIRTUALENV} venv
)
add_custom_command(
    OUTPUT venv.stamp
    DEPENDS venv requirements.txt
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/requirements.txt requirements.txt
    COMMAND ./venv/bin/pip install -r requirements.txt --upgrade
)

# Build command line to run py.test.
set(PYTEST
    ${CMAKE_CURRENT_BINARY_DIR}/venv/bin/python2
    ${CMAKE_CURRENT_BINARY_DIR}/venv/bin/py.test
)


add_custom_target(Tests ALL
    DEPENDS venv.stamp
    SOURCES requirements.txt
)

add_test(NAME run_tests
    COMMAND ${PYTEST} ${CMAKE_CURRENT_SOURCE_DIR}/test_sample.py
)

请注意,如果您使用WORKING_DIRECTORY来覆盖当前工作目录,则可能需要使用${CMAKE_CURRENT_BINARY_PATH/venv}或类似的路径。

3
可以使用${PYTHON_EXECUTABLE}变量替代在set(VIRTUALENV ...)中硬编码的Python版本号,该变量由find_package(...)定义,以保持一致。还应该调用${PYTHON_EXECUTABLE} -m virtualenv以确保调用正确的Python版本。这个CMake脚本在Windows上无法运行,但我目前没有看到解决方法。 - NOhs
我正在尝试执行@NOhs建议的操作,并且可以使用add_custom_command(OUTPUT ${CURRENT_SOURCE_DIR}/.venv COMMAND ${PYTHON_EXECUTABLE} -m venv .venv创建虚拟环境。但是,它给了我错误[100%] 生成venv.stamp 错误:找不到文件“setup.py”。目录无法以可编辑模式安装:/Users/aaragon/Local/plexus/build/temp.macosx-10.9-x86_64-3.8。您知道可能出了什么问题吗? - aaragon
我会这样解决问题:add_custom_command( OUTPUT venv.stamp DEPENDS venv ${PROJECT_SOURCE_DIR}/requirements.txt COMMAND .venv/bin/pip install -e ${CMAKE_CURRENT_SOURCE_DIR} ) - aaragon

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