使用 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
每次都会强制编译
我有一个 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
每次都会强制编译