我有一个名为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的重复问题,但我仍然想在此发布,因为那里没有太多讨论。
谢谢!
答案 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扩展,并使用完整的模块名称+扩展源的完整路径。此外,由于nms
是pytools
包中的模块,因此pytools.nms
中的packages
包含无效。