Pergunta

Criei uma extensão C que eu gostaria de ativar no meu pacote Python (usando setuptools) só no caso de uma opção de linha de comando é passado.Qual é a maneira mais fácil de fazer isso?

Eu não consigo encontrar qualquer simples maneiras de ir sobre isso.

Foi útil?

Solução

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

Isso é hacky, mas pode ser mais fácil. Uma abordagem mais avançada seria estender a classe de distribuição para apoiar uma bandeira, digamos --with-modules e depois personalize o ext_modules dentro do finalize_options.

Outras dicas

Na verdade, há uma distribuir/setuptools recurso chamado de "Recursos" que pode ser usado para isso.É explicitamente projetado para ter setup.py fazer coisas diferentes com base no --with-xxx e --without-xxx opções de linha de comando.

  • Este post de blog dá uma boa introdução, eu não posso encontrar qualquer documentação melhor no momento (além de a Distribuir de origem o Recurso de classe e características chave).
  • A jinja do projeto setup.py usa Recursos para a sua exata finalidade, pode ser um bom modelo para trabalhar.
  • O simplejson setup.py também faz algo semelhante, exceto que é codificado para sempre tentar construir o C-extensão do recurso define, e voltar a cair graciosamente puro python quando a construção de falha;isso também pode ser útil para o seu propósito.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top