python setuptools:如何安装带有 cython 子模块的软件包?

KAI*_*HAO 3 python setuptools cython

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

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

但是安装没有复制编译nms.so/usr/local/lib/python2.7/dist-packages/pytools/nms/.

而当我在 ipython 中导入 pytools 时,遇到了一个错误:

导入错误:无法导入名称 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
)
Run Code Online (Sandbox Code Playgroud)

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()])],
)
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

hoe*_*ing 5

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

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)
)
Run Code Online (Sandbox Code Playgroud)

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