使用 distutils 重新生成 cython 扩展

Regenerate cython extension with distutils

我有一个 cython 文件生成不同的 .c 文件,具体取决于它是为 python 2 还是 python 3 编译的。即:

from .mp_utils import PY3

if PY3:
    builtin = (int, float, str, complex)
else:
    builtin = (int, float, str, long, complex, file)

mp_utils 有这个:

PY3 = sys.version > '3'

此扩展由 distutils 构建。 setup.py 有:

getsize = Extension(
    'memprof.getsize',
    sources=['memprof/getsize.pyx']
)

setup(
    # [...]
    cmdclass={'build_ext': build_ext},
    ext_modules=[getsize],
)

但是,cython 不知道它必须在每次调用 python setup.py install 时重建 .c:

# python3 setup.py test
running test
running egg_info
writing dependency_links to memprof.egg-info/dependency_links.txt
writing requirements to memprof.egg-info/requires.txt
writing memprof.egg-info/PKG-INFO
writing top-level names to memprof.egg-info/top_level.txt
reading manifest file 'memprof.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'memprof.egg-info/SOURCES.txt'
running build_ext
skipping 'memprof/getsize.c' Cython extension (up-to-date)
building 'memprof.getsize' extension
[...]

这是错误的,memprof/getsize.c 不是最新的,它是为 python 2 版本构建的 getsize.c。它必须重建。我如何告诉 distutils(或 cython)它必须在每次调用时重新生成 .c 文件?

我知道我可以手动触摸 memprof/getsize.pyx 或删除 memprof/getsize.c,但您必须记住这样做,这不是我想要的。我想要一些东西,当我执行 python3 setup.py 安装时,无论我之前构建了什么,它都会安装正确的东西。

setup.py 选项可以在 setup.cfg 文件中定义。

因此,在您的 setup.cfg:

中有这样的内容
[build_ext]
force=1

每次都会强制编译