Как создать дистрибутив модуля Python, чтобы изящно вернуться к чистому коду Python
Я написал модуль Python, и у меня есть две версии: чистая реализация Python и расширение C. Я написал __init__.py
файл, так что он пытается импортировать расширение C, и если это не удается, он импортирует чистый код Python (это разумно?).
Теперь я хотел бы знать, как лучше всего распространять этот модуль (например, write setup.py
) так оно может легко быть использован людьми с или без объекта для построения, или пользы, расширения к, как раз мимо бег:
python setup.py install
мой опыт ограничен, но я вижу два возможных варианта:
- у пользователя нет MS Visual Studio или набора компиляторов GCC, установленного на их компьютере, для создания расширения c
- пользователь работает IronPython, Jython или что-нибудь другое, кроме CPython. Я использовал только CPython. Поэтому я не уверен, как я могу распространить этот модуль, чтобы он работал плавно и был прост в установке на этих платформах, если они не могут использовать расширение Си.
3 ответов
(разве это разумно?).
да, вполне разумно.
чтобы поймать "нет подходящего случая компилятора C": вызов setup(...)
будет делать sys.выход в случае возникновения проблем. Итак, сначала попробуйте с ext_modules
аргумент установлен по желанию, в пределах try
:
try:
setup(..., ext_modules=...)
except SystemExit: ...
и except
предложения, звоните setup(...)
еще раз без the ext_modules
(поэтому он отказывается от создания и установки расширений). Пользователь, который установка по-прежнему будет видеть сообщения, такие как "не удалось выполнить gcc-4.0: нет такого файла или каталога", но вы можете соответствующим образом добавить свои собственные сообщения, чтобы сообщить пользователю, что это не имеет большого значения, и что вы пытаетесь снова без модулей расширения.
для поддержки с CPython реализации, в setup.py
вы можете проверить sys.version
(Я не уверен, какое значение будет для каждой реализации без CPython, но IronPython имеет 'IronPython'
подстрока там, например), чтобы избежать даже попытка ext_modules
часть. Если вы пропустите такую реализацию в своих чеках, try / except, вероятно, должен поймать большинство других в любом случае, просто с небольшим количеством потерянной работы;-).
" пытается импортировать расширение C, и если это не удается, он импортирует чистый код Python (это разумно?)."
почти. Читайте о cStringIO
и StringIO
. Также читайте о cPickle
и Pickle
. Также читайте о cElementTree
и ElementTree
.
если версия C не может быть построена, это один вариант использования. Чистая версия Python является единственной доступной.
если версия C может быть построена, однако, у меня все еще есть веские причины для ее отклонения. Первичный, I рассмотрит возможность отклонения версии C, потому что это может не позволить глубину подкласса, которую я требую для своего приложения.
Я не хочу, чтобы меня заставляли использовать версию C, только потому, что у меня был правильный компилятор. Я предпочитаю принимать решения самостоятельно.
следовательно, мне не нравится идея, что какая-то часть вашего модуля принимает мои архитектурные решения за меня. Я предпочитаю выбирать, что импортировать. Если версия C не существует, это не меняет мой процесс принятия решения, потому что я все еще могу создавать подклассы чистой версии Python.
нижняя строка. Автоматизировать меньше. Обеспечивают два модуля. Я предпочитаю выбирать, какой из них импортировать.
По словам документация для Planar можно сделать setup.py
файл для создания расширений C как обычно, а затем:
для построения и установки Planar из исходного дистрибутива или репозитория используйте:
python setup.py install
чтобы установить только модули pure-Python без компиляции, используйте:
python setup.py build_py install --skip-build