Как создать дистрибутив модуля 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