Каков самый простой способ сделать дополнительное расширение C для пакета python?

Я создал расширение C, которое я хотел бы включить в своем пакете Python (с помощью setuptools), только если передана опция командной строки. Каким будет самый простой способ сделать это?

Кажется, я не вижу простых способов обойти это.

Ответы

Ответ 1

ext_modules = []
if '--add-this' in sys.argv:
    ext_modules.append(Extension(...))
    sys.argv.remove('--add-this')
setup(...
      ext_modules = ext_modules
)

Это хаки, но может быть проще. Более продвинутый подход состоял бы в том, чтобы расширить класс Distribution для поддержки флага, скажем --with-modules, а затем настроить ext_modules внутри finalize_options.

Ответ 2

На самом деле существует функция distribute/setuptools, называемая "Features", которая может быть использована для этого. Он явно разработан, чтобы setup.py выполнял разные действия на основе параметров командной строки --with-xxx и --without-xxx.

  • Этот пост в блоге дает хорошее введение, я не могу найти лучшую документацию в это время (кроме источника Distribute - класс Feature и ключевые слова функций).
  • Проект jinja setup.py использует функции для вашей конкретной цели, это может быть хороший шаблон для работы.
  • Simplejson setup.py также делает что-то подобное, за исключением того, что он закодирован, чтобы всегда пытаться создать функцию C-расширения, которую он определяет, и изящно отступают к чистому питону, когда здание терпит неудачу; это также может быть полезно для вашей цели.