Не могу указать назначение модуля расширения, не могу добавить модули Python

Я работаю на NetworKit (https://networkit.iti.kit.edu/), гибридный проект C ++ / Cython / Python. Я хочу подготовить setup.py сценарий, так что NetworKit может быть легко установлен через pip install networkit, Однако есть некоторые трудности.

Во-первых, позвольте мне описать структуру каталогов хранилища и то, что в настоящее время делает setup.py.

Структура каталогов:

NetworKit/
|- setup.py
|- README.rst
|- MANIFEST.in
|-src/
|-cpp/
| c++ header and source files in subfolders
|-python/
|- __init__.py
|- _NetworKit.pyx
| various python modules

python setup.py develop в настоящее время делает 3 вещи:

  • вызывать SCons для сборки ядра C ++
  • построить модуль расширения в папке src/python (для чего нужно ядро ​​C ++)
  • поместите ссылку в pythonX / dist-packages /, которая ссылается на src/python,

Вот соответствующая выдержка из setup.py:

if ("install" in sys.argv) :
build_NetworKit()
src = ["_NetworKit.pyx"]
modules = [Extension("_NetworKit",
src,
language = "c++",
extra_compile_args=["-fopenmp", "-std=c++11", "-O3", "-DNOGTEST"],
extra_link_args=["-fopenmp", "-std=c++11"],
libraries=["NetworKit-Core-{0}".format(optimize)],
library_dirs=["../../"])]

for e in modules:
e.cython_directives = {"embedsignature" : True}

setup(name="networkit",
version="3.2",
url="https://networkit.iti.kit.edu/",
keywords = "graph algorithm network analysis social network",
cmdclass={"build_ext": build_ext},
ext_modules=modules)

Чего я добился до сих пор:
С MANIFEST.in Я успешно включил все заголовочные и исходные файлы C ++ в пакет. python setup.py sdist а также pip install networkit с тестового сервера PyPI успешно компилирует библиотеку, создает расширение и помещает его в pythonX/dist-packages/, Вот где начинаются проблемы:

  1. Я хочу, чтобы расширение было помещено под pythonX/dist-packages/networkit-x.y/, Кроме того, _NetworKit.pyx не включается автоматически, хотя он является источником для модуля расширения; Я должен был включить его через MANIFEST.in,
  2. Я попытался добавить модуль Python и подмодули, добавив packages а также package_dir в setup(...) в приведенной выше выдержке. В то время как sdist работал и включал все .py файлы, которые я обычно заканчивал directory ... not existing во время установки. Кроме того, я попытался адаптировать структуру хранилища, а также расположение setup.py чтобы быть в большей степени в соответствии с официальными рекомендациями. Однако это тоже не помогло.

Также, чтобы подвести итог, что именно должно быть установлено, где: модули Python и субмодули, а также расширение должны идти под pythonX/dist-packages/networkit-x.y/,

Помимо, вероятно, не очень правильной структуры каталогов, что мне не хватает в setup(...) Конфигурация, чтобы получить расширение, а также правильно установленные модули Python?

2

Решение

Во-первых, вам нужно ключевое слово distutils setup () package_dir={'':'src/python'} чтобы указать корневую папку ваших модулей Python, а во-вторых, вы можете использовать функцию setuptools find_packages(root_dir, include=[], exclude=[]) найти нужные вам пакеты / модули. Так что вы, вероятно, захотите использовать packages=find_packages('src/python'),

Увидеть Вот в документации setuptools для получения дополнительной информации.

Setuptools всегда установит ваш пакет под ../site-packages/<packagename>, dist-packages является дополнением к Debian для установленных пакетов менеджера системных пакетов; но ваш питон должен выглядеть под правильным site-packages папка тоже.

Если вы хотите легко устанавливать и удалять пакеты во время разработки, я бы использовал pip install -e . а также pip uninstall -y networkit соответственно. Наличие pip-управления установкой позволяет также удалить его (чтобы вы могли проверить, все ли прошло нормально и т. Д.).

1

Другие решения


По вопросам рекламы [email protected]