【问题标题】:distutils does not recompile C extension modulesdistutils 不会重新编译 C 扩展模块
【发布时间】:2011-04-08 18:39:41
【问题描述】:

我正在尝试将 distutils 与包含用 C 编写的扩展的 Python 模块一起使用。程序代码位于 Linux 服务器上,但有时我使用文件传输程序 WinSCP 从 Windows 机器上传更改(编辑完成在记事本++中)。我注意到 distutils 通常不会注意到 C 代码中的这些更改(即,如果以前编译过代码,python setup.py build 不会触发 gcc)。检查服务器上的 C 源代码表明它确实已正确更新。另一方面,使用像vim 这样的文本编辑器直接在服务器上更改代码总是会导致python setup.py build 重新编译更改的文件。知道为什么上传更改的文件可能不会导致 distutils 重新编译它们吗?

谢谢。

编辑: 在进一步调查之后,如果我只是使用 Makefile 创建一个普通的 C 程序,我会注意到同样的问题。因此,这个问题看起来不像是 distutils 问题。

【问题讨论】:

    标签: python distutils


    【解决方案1】:

    查看 distutils 的源代码并查看它如何强制重建,它看起来像是检查文件的时间戳以确定文件是否过期。

    你能确定当 winscp 上传文件时时间戳正在改变吗?否则,看起来构建命令有一个“强制”选项,无论如何都会强制重建。

    【讨论】:

    • 谢谢。我已经更新了我的原始帖子,现在注意到 make 命令也会出现这个问题,所以这不是 distutils 独有的问题。尽管如此,在我弄清楚为什么上传的文件没有触发编译之前,强制选项确实可以完成工作。
    • 实际上,这仍然可能是与时间戳相关的问题。如果我没记错的话,GNU make 最终会根据之前构建的目标文件检查源文件的时间戳。如果发现源文件更新,那么它将强制重建。做两件事来解决这个问题——首先通过ls -l检查文件在 scp 上传前后的时间戳,并将其与构建的对象文件的时间戳进行比较。然后尝试在源文件上运行touch 并查看目标文件是否被重建。
    猜你喜欢
    • 2012-11-27
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2011-03-13
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多