Написание пакетов Python с несколькими модулями C - PullRequest
11 голосов
/ 02 февраля 2010

Я пишу расширение Python C, которое использует API Pygame C. Все идет нормально. Теперь мне интересно, как мне организовать исходный код, чтобы в пакете было несколько подмодулей. Все учебные пособия посвящены одному .c расширению файла. Я попытался просмотреть некоторые файлы setup.py в проектах, но они поразили меня сложностью, и я не мог видеть лес за деревьями.

По сути, у меня есть расширение, скажем, MyExt. MyExt имеет глобальные функции и 3 типа. Как мне организовать списки PyMethodDef? Должен ли я поместить их всех в один список? Кроме того, я заметил, что объект Extension, который вы передали в функцию установки, на самом деле является массивом модулей, так как же мне назвать модули, чтобы они все были в одном пакете и могли видеть друг друга?

Мой setup.py:

main_mod = Extension('modname',
                include_dirs = ['C:\Libraries\Boost\include',
                                'C:\Libraries\SDL\include',
                                'C:\Libraries\SDL_image\include'],

                libraries = ['libSDL',
                             'SDL_image'],

                library_dirs = ['C:\Libraries\SDL\lib',
                                'C:\Libraries\SDL_image\lib'],

                sources = ['main.cpp',
                           'Object1.cpp',
                           'Object2.cpp',
                           'Etcetera.cpp'])

Итак, когда я звоню: setup (name = "Некоторое человеческое удобочитаемое имя, верно?", Ext_modules = [main_mod]) Я могу добавить другие модули в список ext_modules, но что мне передать в качестве первого параметра в «Расширение»? Я использую строку, разделенную точкой, как 'mypackage.submodule'?

В целом, как организовать расширение C с несколькими подмодулями? Если кто-нибудь может указать мне на какой-нибудь исходный код, который легко читать и понимать, это было бы здорово. Большое спасибо!

Ответы [ 2 ]

14 голосов
/ 02 февраля 2010

Я думаю, что самый простой способ сделать это - создать пакет в «чистом питоне»; другими словами, создайте mypackage/, создайте пустой mypackage/__init__.py, а затем установите для модулей расширения значение mypackage/module1.so, mypackage/module2.so и т. д.

Если вы хотите, чтобы вещи в mypackage были пустыми, вы можете импортировать их из другого модуля расширения в __init__.py.

1 голос
/ 27 февраля 2011

Я не уверен, что понял, что вы хотите. Но есть своего рода пространство имен пакета Python. Вы можете поместить модуль в другое место, но все они имеют одинаковое имя пакета. Здесь вы можете сослаться на этот вопрос Как мне создать пакет пространства имен в Python?

...