Cython、CMake和setup.py、python在一个子目录下编译两次

2024-06-28

我正在尝试按照以下结构与 Cython 绑定一起构建 C++ 库https://bloerg.net/2012/11/10/cmake-and-distutils.html https://bloerg.net/2012/11/10/cmake-and-distutils.html.

问题是,期间make install,扩展将被编译两次。当只有一个 main 时,不会发生这种双重编译CMakeLists.txt在主文件夹中(调整路径)。详细信息如下:

我的项目结构是

.
├── CMakeLists.txt
├── python
│   ├── CMakeLists.txt
│   ├── a_py.pxd
│   ├── a_py.pyx
│   └── setup.py.in
└── src
    ├── A.cpp
    └── A.h

顶层CMakeLists.txt仅包含add_subdirectory(python).

python/CMakeLists.txt is

IF(NOT ${PYTHON})
    find_program(PYTHON "python")
ENDIF()

set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in")
set(SETUP_PY    "${CMAKE_CURRENT_BINARY_DIR}/setup.py")

set(PY_OUTPUT      "${CMAKE_CURRENT_BINARY_DIR}/build/pytimestamp")

configure_file(
    ${SETUP_PY_IN}
    ${SETUP_PY}
)

add_custom_command(OUTPUT "${PY_OUTPUT}"
                   COMMAND ${PYTHON} ${SETUP_PY} build_ext
                   COMMAND ${CMAKE_COMMAND} -E touch ${PY_OUTPUT}
               )

add_custom_target(a_py ALL DEPENDS ${PY_OUTPUT})

install(CODE "execute_process(COMMAND ${PYTHON} ${SETUP_PY} install)")

setup.py is:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [
    Extension(
    name="a",
    sources=["${CMAKE_CURRENT_SOURCE_DIR}/a_py.pyx", "${CMAKE_CURRENT_SOURCE_DIR}/../src/A.cpp"],
    include_dirs = ['${CMAKE_CURRENT_SOURCE_DIR}/../src'],
    language="c++",
    ),
]
setup(
    name = 'a',
    version='${PROJECT_VERSION}',
    cmdclass = {'build_ext': build_ext},
    ext_modules = ext_modules,
    package_dir={ 'a': '${CMAKE_CURRENT_SOURCE_DIR}' },
)

在这两种情况下(CMakeFile.txt在根或在python子文件夹),首先是build_ext步骤运行:

Scanning dependencies of target a_py
[100%] Generating build/pytimestamp
running build_ext

并编译生成的a_py.cpp and A.cpp并链接库。 在安装步骤中,再次运行编译只有当CMakeFile.txt在里面python子文件夹.

这是安装过程中发生的情况:

running build_ext
skipping '/Users/xxx/tmp/ctest/t08/python/a_py.cpp' Cython extension (up-to-date)
building 'a' extension
creating build

请注意,a_py.pyx不会再次进行 cythonized,但会重新创建构建目录(构建和安装步骤之间相同)并且编译文件(使用完全相同的编译器和链接器调用)。

完整的示例可以在这里找到:https://github.com/zeeMonkeez/cmakeCythonTest https://github.com/zeeMonkeez/cmakeCythonTest


我有同样的问题。显然,就我而言,在安装阶段setup.py在构建阶段找不到放置已编译扩展的目录时遇到困难,因此即使使用--skip-build switch.

我通过在构建和安装阶段指定相同的目录路径来解决--build-lib and --build-dir分别切换:

    add_custom_command(OUTPUT ${PY_OUTPUT}
            COMMAND ${PYTHON} ${SETUP_PY} build_ext --build-lib ${CMAKE_CURRENT_BINARY_DIR}/mysoext
            COMMAND ${CMAKE_COMMAND} -E touch ${PY_OUTPUT}
            DEPENDS ${DEPS}
            )
...
        set(MYINSTCMD "\
            EXECUTE_PROCESS(COMMAND ${PYTHON} ${SETUP_PY} install_lib \
            --skip-build \
            --install-dir /my/install/dir \
            --build-dir ${CMAKE_CURRENT_BINARY_DIR}/mysoext)")
        install(CODE "${MYINSTCMD}")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cython、CMake和setup.py、python在一个子目录下编译两次 的相关文章

  • async for 的语义等价物

    从相对于的文档async for根据 Python 3 5 中的语法 我发现引入它是为了迭代可等待的迭代器 不过 在描述之后的语义等价物中 我没有得到一些东西 iter ITER iter type iter aiter iter runn
  • pycharm自动将制表符转换为空格

    我正在使用 pycharm IDE 进行 python 开发 它对于 django 代码来说工作得很好 因此怀疑将制表符转换为空格是默认行为 但是在 python IDE 中到处都会出现错误 因为它无法自动将制表符转换为空格 有没有办法实现
  • Django 3.1:带有异步生成器的 StreamingHttpResponse

    Django 3 1 文档 https docs djangoproject com en 3 1 topics async async views 7E text The 20main 20benefits 20are 20the 20a
  • 替换 pytest 中的测试用例继承?

    背景 在 Python 中unittest https docs python org 3 library unittest html在框架中 在一组基本测试上使用继承来将整套测试应用于新问题 并且偶尔添加其他测试是一种相当常见的习惯用法
  • 一个类的多个实例

    我正在尝试用 python 编写各种动物的生活模拟 不可能命名我将要使用的类的每个实例 因为我无法知道会有多少个实例 所以 我的问题是 如何自动为对象命名 我正在考虑创建一个 Herd 类 它可以是该类型的所有动物同时存活 嗯 通常 您只需
  • Python 中的双 SSH 隧道

    今天 我在命令行中使用 ssh 将端口从远程服务器转发 使用中间服务器到我的本地计算机 这是我在 shell 中使用的命令 ssh user remote server L 2443 localhost 433 此 ssh 会话使用 ssh
  • 调整 MLPRegressor 超参数

    我一直在尝试调整 MLP 模型的超参数来解决回归问题 但总是收到收敛警告 这是我的代码 def mlp model X Y estimator MLPRegressor param grid hidden layer sizes 50 50
  • 如何在条形图上添加值标签

    我正在创建一个条形图 但我不知道如何在条形图上添加值标签 在条形图的中心或正上方 我相信解决方案是使用 文本 或 注释 但我 a 不知道该使用哪一个 一般来说 还没有弄清楚何时使用哪一个 b 无法看到任何一个来呈现值标签 这是我的代码 im
  • python中带括号和不带括号调用函数有什么区别? [复制]

    这个问题在这里已经有答案了 我有个问题 假设我们有函数 hello 带括号和不带括号调用有什么区别 当我调用 hello 时 它引用的是一个值等于此函数的对象 或者也许我错了 当我不带括号调用它时会发生什么 我想知道为什么 def hell
  • matplotlib中有制作散点图矩阵的函数吗?

    散点图矩阵示例 matplotlib pyplot中有这样的函数吗 对于那些不想定义自己的函数的人来说 Python 中有一个很棒的数据分析库 称为Pandas http pandas pydata org 在那里可以找到分散矩阵 http
  • 使用 scipy 在 python 中读取 MatLab 文件

    我正在使用 python 和 scipy 包来读取 MatLab 文件 然而 它需要太长时间并且崩溃 The Dataset http realitycommons media mit edu RealityMining zip大小约为50
  • 如何在 pywebview 中使无框窗口可拖动?

    我最近一直在使用 pywebview 和 Flask 来开发桌面应用程序 我想使用无框窗口功能并创建自己的标题栏 但问题是我不知道如何使该无框窗口可拖动 文档说它可以通过拖动任何点来移动 但对我来说情况并非如此 有任何想法吗 拖动区域 ht
  • 有没有办法向后遍历 dask 数据帧?

    我想要read parquet但从开始的地方向后阅读 假设索引已排序 我不想将整个镶木地板读入内存 因为这违背了使用它的全部意义 有什么好的方法可以做到这一点吗 假设数据帧已建立索引 索引的反转可以通过两步过程完成 反转分区的顺序并反转每个
  • 无法在 BeautifulSoup 中获得正确的链接

    我正在尝试解析一些 HTML 并且想提取与特定模式匹配的链接 我正在使用find使用正则表达式的方法 但它没有给我正确的链接 这是我的片段 有人可以告诉我我做错了什么吗 from BeautifulSoup import Beautiful
  • f2py:公开“已使用”模块的参数

    我认为这个问题已经在某个地方得到解决 但我花了大量的时间四处寻找答案 包括深入研究源代码 我试图将问题放在第一段中 其余部分显示了问题的基本示例 我正在尝试编译一个包含USE指向另一个更通用的模块的语句 我更愿意将使用的模块分开 以便它可以
  • py.test 日志控制

    我们最近切换到 py test 进行 python 测试 顺便说一句 这非常棒 但是 我试图弄清楚如何控制日志输出 即内置的 python 日志记录模块 我们安装了 pytest capturelog 并且它按预期工作 当我们想查看日志时
  • CMake 忽略自定义目标的返回

    我已将此自定义目标添加到我的CMakeList txt file 系统 Windows 7 TDMGCC MinGW32 和来自 GitHub 的最新 Ninja ADD CUSTOM TARGET unittest run COMMAND
  • 为什么我不能将 addstr() 添加到 pythoncurses 窗口中的最后一行/列?

    使用Python 我尝试使用addstr 将光标位置写入curses 窗口的右下角 但出现错误 ScreenH 2工作正常 但打印在窗口底部的第二行 ScreenH 1根本不起作用 我究竟做错了什么 import curses Screen
  • 使用具有阿拉伯字符的 json.dumps 将字典转换为 json [重复]

    这个问题在这里已经有答案了 我有一本包含阿拉伯语单词的字典 例如 data name name print json dumps data file open data json a encoding utf 8 Output name u
  • Python 内存使用情况

    因此 我有一些代码接收一组文件 将其可以缝合在一起 然后绘制它们 我发布了大部分代码 试图使其更具可读性 如果需要 可以添加更多代码 for paths dirs files in os walk start path for d in d

随机推荐