Python setuptools: как установить пакет с подмодулями cython?

У меня есть пакет 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), но я все же хочу разместить его здесь, потому что там не так много дискуссий.

Спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
2 028
1

Ответы 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 extension в cythonize() и использую полное имя модуля + полные пути к источникам расширений. Кроме того, поскольку nms является модулем в пакете pytools, включение pytools.nms в packages не имеет никакого эффекта.

Привет, hoefling, спасибо за ответ! Но у меня есть еще один вопрос после того, как я сделал то, что вы предложили. Сгенерированный файл .so находится в build/lib.linux-x86_64-3.5/pytools/nms.cpython-35m-x86_64-li‌​nux-gnu.so, я не могу импортировать его в pytools/pytools/nms/__init__.py. Вы знаете, как это решить?

KAI ZHAO 26.04.2018 11:29

Вам действительно нужен пакет nms, если он не содержит ничего, кроме расширения nms? Конечно, можно поместить расширение в пакет, поэтому его импорт станет import pytools.nms.nms.nms_func, но действительно ли это необходимо? Помните, плоский лучше, чем вложенный. Или сделайте nms отдельным дистрибутивом Python (с собственным сценарием установки), создайте там расширение nms и позвольте pytools зависеть от пакета nms (с помощью ключевого слова install_requires в сценарии установки pytools).

hoefling 26.04.2018 14:28

Скажите, какую архитектуру вы представляете для pytools, и я соответствующим образом обновлю ответ.

hoefling 26.04.2018 14:29

Для более глубокого размещения расширения nms должно быть достаточно добавить pytools.nms в список packages и адаптировать имя расширения к pytools.nms.nms.

hoefling 26.04.2018 14:34

Кажется, это решено, поскольку я добавляю пакеты: ['pytools', 'pytools / nms'] 'в setup.py. В любом случае, спасибо.

KAI ZHAO 27.04.2018 16:03

Хм, вы уверены, что это решит проблему? Поскольку pytools/nms не является допустимым именем пакета.

hoefling 27.04.2018 17:54

@hofling, может, ты сможешь помочь с этим? stackoverflow.com/q/50448026/4080129

Martino 21.05.2018 14:44

Другие вопросы по теме