【问题标题】:setuptools_scm version affected by comments in C code generated by Cythonsetuptools_scm 版本受 Cython 生成的 C 代码中的注释影响
【发布时间】:2020-01-15 04:17:50
【问题描述】:

为这个稍微复杂的问题道歉 - 这是我的场景:

当有一个新的 git 标签时,我有一个管道可以将包从 Travis 部署到 PyPI。我的包包含 Cython 模块,生成的 C 代码也是存储库的一部分。

在 Travis 上构建期间,C 代码会重新生成,并且由于生成的 cmets 包含特定于环境的路径,因此文件会发生变化。由于文件现在已从标记的提交中修改,setuptools_scm 不再返回干净的版本号 (0.1),而是返回类似 0.2.dev0+... 的内容,这会使部署到 PyPI 失败。

我目前解决此问题的想法是:

  • 从存储库中排除 C 代码(我不想这样做
  • 在部署之前硬重置到最后一个标签(不确定这是否可行,但希望避免
  • 告诉 Cython 不要用 cmets 注释 C 代码(我的首选解决方案,但显然 Cython 没有这样的选项?
  • 从确定版本号中排除 C 文件(如何?
  • 不要在 Travis 上重新生成 C 文件

以下哪个是首选解决方案?有没有更好的办法?

【问题讨论】:

  • 我原以为 emit_code_comments option 会这样做,但它似乎对我不起作用......嗯......编辑:已经在 github 上报告了 github.com/cython/cython/issues/2740
  • 我看到你找到了错误报告。我在第一次阅读时错过的一件事是它确实作为编译器指令工作,而不是作为选项......你看到了吗,这是否解决了问题?
  • 哦,谢谢,我确实也错过了。无论如何,我目前倾向于不让 Travis 重新编译 Cython 代码。

标签: python git cython travis-ci setuptools


【解决方案1】:

可以关闭在生成的 C 文件中包含原始代码(您的首选解决方案)。它在 Cython 中的记录很差:documentation claims that it's a compiler option*

Cython.Compiler.Options.emit_code_comments = True

将原始源代码逐行复制到生成的代码文件中的 C 代码 cmets 中,以帮助理解输出。这也是覆盖分析所必需的。

但是,this is no longer true 实际上是一个编译器指令(不同,因为它们只应用于本地而不是整个文件)。有很多方法可以应用这些,但其中一种方法是在 setup.py 中:

setup(
    ext_modules = cythonize("example.pyx", 
         compiler_directives={'emit_code_comments': False})
)

我怀疑 Cython 文件的确切文本仍然有点容易因环境的微小变化而发生变化,因此仅此一项可能无法 100% 解决您的问题。


* - 我想文档会在某个时候修复,而我引用的链接将会过时......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2017-04-08
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多