python setuptools:如何用cython子模块安装包?

时间:2018-04-16 15:34:47

标签: python cython setuptools

我有一个名为pytools的python包。 它包含一个基于cython的子模块nms

当我使用sudo python -H setup.py安装根包pytools时, root包似乎安装得正确。

但安装并未将已编译的nms.so复制到/usr/local/lib/python2.7/dist-packages/pytools/nms/

当我在ipython中导入pytools时遇到错误:

  

ImportError:无法导入名称nms

如果我手动将pytools/nms/nms.so复制到/usr/local/lib/python2.7/dist-packages/pytools/nms/,问题就解决了。

这是根包的setup.py

import os
import numpy
from distutils.core import setup, Extension
from Cython.Build import cythonize

exec(open('pytools/version.py').read())
exts = [Extension(name='nms',
                  sources=["_nms.pyx", "nms.c"],
                  include_dirs=[numpy.get_include()])
        ]
setup(name='pytools',
  version=__version__,
  description='python tools',
  url='http://kaiz.xyz/pytools',
  author_email='zhaok1206@gmail.com',
  license='MIT',
  packages=['pytools', 'pytools.nms'],
  #packages=['pytools'],
  zip_safe=False
)

setup.py子包nms

from distutils.core import setup, Extension
import numpy
from Cython.Distutils import build_ext
setup(
    cmdclass={'build_ext': build_ext},
    ext_modules=[Extension("nms",
    sources=["_nms.pyx", "nms.c"],
    include_dirs=[numpy.get_include()])],
)

这似乎是Attempting to build a cython extension to a python package, not creating shared object (.so) file的重复问题,但我仍然想在此发布,因为那里没有太多讨论。

谢谢!

1 个答案:

答案 0 :(得分:3)

您不需要子包中的安装脚本。只需在根设置脚本中构建扩展:

exts = [Extension(name='pytools.nms',
                  sources=["pytools/nms/_nms.pyx", "pytools/nms/nms.c"],
                  include_dirs=[numpy.get_include()])]

setup(
    ...
    packages=['pytools'],
    ext_modules=cythonize(exts)
)

请注意,我在cythonize()中包装了cythonized扩展,并使用完整的模块名称+扩展源的完整路径。此外,由于nmspytools包中的模块,因此pytools.nms中的packages包含无效。