У меня есть пакет Python с именем pytools. Он содержит основанный на cython подмодуль НМС.
Когда я устанавливаю pytools корневого пакета с sudo python -H setup.py,
кажется, что корневой пакет установлен правильно.
Но установка не копировала скомпилированный nms.so на /usr/local/lib/python2.7/dist-packages/pytools/nms/.
И когда я импортирую pytools в ipython, возникла ошибка:
ImportError: cannot import name 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='[email protected]',
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()])],
)
Кажется, что это дублированный вопрос с Попытка создать расширение cython для пакета python без создания файла общего объекта (.so), но я все же хочу разместить его здесь, потому что там не так много дискуссий.
Спасибо!






Вам не нужен сценарий установки в подпакете. Просто создайте расширение в корневом сценарии установки:
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 extension в cythonize() и использую полное имя модуля + полные пути к источникам расширений. Кроме того, поскольку nms является модулем в пакете pytools, включение pytools.nms в packages не имеет никакого эффекта.
Вам действительно нужен пакет nms, если он не содержит ничего, кроме расширения nms? Конечно, можно поместить расширение в пакет, поэтому его импорт станет import pytools.nms.nms.nms_func, но действительно ли это необходимо? Помните, плоский лучше, чем вложенный. Или сделайте nms отдельным дистрибутивом Python (с собственным сценарием установки), создайте там расширение nms и позвольте pytools зависеть от пакета nms (с помощью ключевого слова install_requires в сценарии установки pytools).
Скажите, какую архитектуру вы представляете для pytools, и я соответствующим образом обновлю ответ.
Для более глубокого размещения расширения nms должно быть достаточно добавить pytools.nms в список packages и адаптировать имя расширения к pytools.nms.nms.
Кажется, это решено, поскольку я добавляю пакеты: ['pytools', 'pytools / nms'] 'в setup.py. В любом случае, спасибо.
Хм, вы уверены, что это решит проблему? Поскольку pytools/nms не является допустимым именем пакета.
@hofling, может, ты сможешь помочь с этим? stackoverflow.com/q/50448026/4080129
Привет, hoefling, спасибо за ответ! Но у меня есть еще один вопрос после того, как я сделал то, что вы предложили. Сгенерированный файл .so находится в
build/lib.linux-x86_64-3.5/pytools/nms.cpython-35m-x86_64-linux-gnu.so, я не могу импортировать его вpytools/pytools/nms/__init__.py. Вы знаете, как это решить?