É possível especificar um arquivo de script Python pós-instalação como parte do arquivo setuptools setup.py para que um usuário possa executar o comando:
python setup.py install
em um arquivo de projeto local, ou
pip install <name>
para um projeto PyPI e o script será executado na conclusão da instalação do setuptools padrão? Estou procurando realizar tarefas pós-instalação que podem ser codificadas em um único arquivo de script Python (por exemplo, entregar uma mensagem pós-instalação personalizada ao usuário, extrair arquivos de dados adicionais de um repositório de origem remoto diferente).
Eu encontrei esta resposta SO de vários anos atrás que aborda o tópico e parece que o consenso na época era que você precisa criar um subcomando de instalação. Se esse ainda for o caso, seria possível alguém fornecer um exemplo de como fazer isso para que não seja necessário que o usuário digite um segundo comando para executar o script?
fonte
Respostas:
Nota: A solução abaixo só funciona ao instalar um zip ou tarball de distribuição de código-fonte, ou instalar em modo editável a partir de uma árvore de código-fonte. Ele vai não funciona quando instalando a partir de uma roda de binário (
.whl
)Esta solução é mais transparente:
Você fará alguns acréscimos
setup.py
e não há necessidade de um arquivo extra.Além disso, você precisa considerar duas pós-instalações diferentes; um para o modo de desenvolvimento / editável e o outro para o modo de instalação.
Adicione essas duas classes que incluem seu script pós-instalação para
setup.py
:e insira o
cmdclass
argumento parasetup()
funcionar emsetup.py
:Você pode até chamar comandos shell durante a instalação, como neste exemplo, que faz a preparação de pré-instalação:
PS, não há nenhum ponto de entrada de pré-instalação disponível nas ferramentas de configuração. Leia esta discussão se você está se perguntando por que não há nenhum.
fonte
install
comando real ?run
o pai primeiro , seu comando é uma pós-instalação, caso contrário, é uma pré-instalação. Eu atualizei a resposta para refletir isso.install_requires
dependências são ignoradaspip3
. O script de instalação foi executado durante a publicação do pacote, mas não durante a instalação.Nota: A solução abaixo só funciona ao instalar um zip ou tarball de distribuição de código-fonte, ou instalar em modo editável a partir de uma árvore de código-fonte. Ele vai não funciona quando instalando a partir de uma roda de binário (
.whl
)Esta é a única estratégia que funcionou para mim quando o script pós-instalação exige que as dependências do pacote já tenham sido instaladas:
fonte
atexit
manipulador em vez de simplesmente chamar a função pós-instalação após a etapa de instalação?setuptools
é muito pouco documentado. Outros já alteraram suas respostas a estas perguntas e respostas com as soluções corretas.atexit
e não redefinirinstall.run()
(esse é o motivo pelo qual as dependências não são mais tratadas). Além disso, para saber o diretório de instalação, coloquei_post_install()
como método denew_install
, o que me permite acessarself.install_purelib
eself.install_platlib
(não sei qual usar, masself.install_lib
está errado, estranhamente).Nota: A solução abaixo só funciona ao instalar um zip ou tarball de distribuição de código-fonte, ou instalar em modo editável a partir de uma árvore de código-fonte. Ele vai não funciona quando instalando a partir de uma roda de binário (
.whl
)Uma solução poderia ser a de incluir um
post_setup.py
nosetup.py
diretório 's.post_setup.py
conterá uma função que faz a pós-instalação esetup.py
só irá importá-la e iniciá-la no momento apropriado.Em
setup.py
:Em
post_setup.py
:Com a ideia comum de iniciar a
setup.py
partir de seu diretório, você será capaz de importar, casopost_setup.py
contrário, ele iniciará uma função vazia.Em
post_setup.py
, aif __name__ == '__main__':
instrução permite que você inicie manualmente a pós-instalação a partir da linha de comando.fonte
run()
faz com que as dependências do pacote não sejam instaladas.cmdclass
foi substituído, eu consertei isso.post_install()
depois doinstall_data.run(self)
contrário, você estará perdendo algumas coisas. Comodata_files
pelo menos. Obrigado kynan.install_data
não é executado no meu caso. Então, não tematexit
a vantagem de garantir que o script de pós-instalação seja executado no final, em qualquer situação?Combinando as respostas de @Apalala, @Zulu e @mertyildiran; isso funcionou para mim em um ambiente Python 3.5:
Isso também dá acesso ao caminho de instalação do pacote em
install_path
, para fazer algum trabalho no shell.fonte
Acho que a maneira mais fácil de realizar a pós-instalação e manter os requisitos é decorar a chamada para
setup(...)
:Isso será executado
setup()
ao declararsetup
. Depois de concluída a instalação dos requisitos, ele executará a_post_install()
função, que executará a função interna_post_actions()
.fonte
Se estiver usando atexit, não há necessidade de criar um novo cmdclass. Você pode simplesmente criar seu registro atexit antes da chamada setup (). Ele faz a mesma coisa.
Além disso, se você precisa que as dependências sejam instaladas primeiro, isso não funciona com a instalação do pip, pois seu manipulador atexit será chamado antes que o pip mova os pacotes para o lugar.
fonte
Não consegui resolver um problema com nenhuma das recomendações apresentadas, então aqui está o que me ajudou.
Você pode chamar a função, que deseja executar após a instalação apenas depois
setup()
emsetup.py
, assim:fonte