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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top