【问题标题】:python setuptools: how can I install package with cython submodules?python setuptools:如何安装带有 cython 子模块的软件包?
【发布时间】:2018-09-26 10:02:20
【问题描述】:

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

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

但是安装并没有将编译好的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.pynms

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重复的问题,但我还是想在这里发布,因为那里没有太多讨论。

谢谢!

【问题讨论】:

    标签: python cython setuptools


    【解决方案1】:

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

    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)
    )
    

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

    【讨论】:

    • 嗨 hoefling,感谢您的回答!但是按照你的建议做了之后我还有一个问题。生成的.so 文件位于build/lib.linux-x86_64-3.5/pytools/nms.cpython-35m-x86_64-linux-gnu.so,我无法在pytools/pytools/nms/__init__.py 中导入t。你知道怎么解决吗?
    • 如果nms 包只包含nms 扩展名,你真的需要它吗?当然也可以把扩展放在包里,所以它的import变成import pytools.nms.nms.nms_func,但是真的有必要吗?请记住,flat is better than nested。或者,将nms 制作成一个单独的python 发行版(使用自己的安装脚本),在那里构建nms 扩展并让pytools 依赖于nms 包(通过install_requires 关键字在pytools' 安装脚本中) .
    • 告诉我你为pytools设想的架构,我会相应地更新答案。
    • 为了更深入地放置nms 扩展,只需将pytools.nms 添加到packages 列表并将扩展名称调整为pytools.nms.nms
    • 自从我将 'packages: ['pytools', 'pytools/nms']' 添加到 setup.py 后,它似乎已解决。还是谢谢你。
    猜你喜欢
    • 2017-12-18
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2010-11-14
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多