Distribuindo um aplicativo python
-
19-09-2019 - |
Pergunta
Eu tenho um aplicativo de python simples onde minha estrutura de diretório é o seguinte:
- project /
- main.py
- config.py
- plugins /
- plugin1
- plugin2
- ...
arquivos de configuração apenas cargas config.py, ele não contém qualquer informação de configuração em si.
Agora eu quero distribuir este programa, e eu pensei que eu ia usar setuptools para fazê-lo. Os usuários de arquivo são esperados para uso é main.py, de modo que um vai claramente para / usr / bin e o resto dos arquivos de entrar em / usr / share / projeto.
Mas há um problema: eu de alguma forma precisa dizer main.py procurar config.py no diretório share. Mas eu não posso realmente ter certeza de onde exatamente o diretório share é uma vez que é até setuptools, certo?
Qual é a melhor prática, quando a distribuição de aplicativos baseados em Python?
Solução
setuptools instalar o pacote em um local que é acessível a partir de python ou seja, você pode importá-lo:
import project
o aumento problema quando você faz as importações relativas em vez de importações absolutos. se suas importações main.py
config.py
ele funciona porque eles vivem no mesmo diretório. quando você mover o main.py
para outro local como /usr/bin
ou em outro local presente em PATH variável de ambiente, python tentar config.py
importação de sys.path
e não do seu dir pacote. a solução é usar a importação absoluta:
from project import config
Agora main.py
é "móvel".
outra solução, que eu prefiro, está usando a criação script automático oferecido pelo setuptools .
em vez de ter seu código em um
if __name__ == "__main__":
# here all your beautiful code
declaração, coloque seu código em uma função (principal poderia ser um nome bom):
def main():
# put your code here
if __name__ == "__main__": # not needed, just in case...
main()
Agora modificar seu setup.py
:
setup(
# ...
entry_points = {
"console_scripts": [
# modify script_name with the name you want use from shell
# $ script_name [params]
"script_name = project.main:main",
],
}
)
isso é tudo. depois de uma instalação setuptools irá criar um script que é exigível a partir de casca e que chama sua função principal. agora main.py
pode viver no diretório do projeto e você não precisa mais para movê-lo em um diretório bin/
. nota que setuptools coloca automaticamente este script no diretório bin/
em relação ao prefixo de instalação.
es.
python setup.py install --prefix ~/.local
instalar o pacote de projeto em
~/.local/lib/python<version>/site-packages/<package_name>
e seu script no
~/.local/bin/<script_name>
para ter certeza que ~/.local/bin
está presente em sua PATH env.
Mais informações em: http://peak.telecommunity.com/DevCenter / setuptools #-script-criação automática