Devo includere script in un pacchetto Python?

3

Nella mia applicazione Python, posso distinguere tra i punti di ingresso (script) e quello che penso come codice di libreria.

Il mio istinto è di inserire il codice della libreria all'interno di un pacchetto e gli script che importano altrove dal pacchetto.

È possibile utilizzare setup.py per fare riferimento a metodi all'interno di un pacchetto da utilizzare come entry-point, avendo quindi tutto il codice Python all'interno dei pacchetti.

Quale è preferibile?

Nota: questo link tratta entrambe le opzioni ma in realtà non offre un'opinione.

Modifica: per dare un esempio più concreto, sto rivedendo del codice che contiene un pacchetto. Al suo interno ci sono quaranta moduli:

  • __init__.py
  • 11 'script'
  • 10 "moduli di libreria" utilizzati da quegli script
  • 18 moduli di test

Non sembra che stia usando la capacità dei pacchetti molto bene, ma non riesco a capire cosa sia esattamente sbagliato.

Apprezzo che fare test nello stesso pacchetto non fosse nella mia domanda iniziale.

    
posta wrgrs 28.01.2016 - 17:47
fonte

3 risposte

1

Due anni dopo, sento di poter rispondere alla mia domanda.

È preferibile utilizzare il metodo Setuptools entry_points . Questo è descritto bene nella documentazione dei clic , e i punti principali sono:

  • funziona meglio su Windows
  • Pythonpath è gestito da Setuptools, quindi (ad esempio) se lo script è installato all'interno di una virtualenv, non è necessario attivare virtualenv perché funzioni correttamente
risposta data 01.06.2018 - 09:59
fonte
3

Sì, questo è possibile e abbastanza comune per i pacchetti che fungono sia da strumenti da riga di comando sia da librerie importate.

In setup.py , aggiungi la funzione di un modulo come punto di ingresso:

setuptools.setup(
    ...
    entry_points={'console_scripts': [
        'foo = my_package.some_module:main_func',
    ]},
    ...
)

Per creare uno script denominato foo che chiama la funzione my_func all'interno di my_package.some_module . Maggiori informazioni su link .

È anche una convenzione da aggiungere:

#!/usr/bin/env python

...

if __name__ == '__main__':
    my_func()

ai moduli che possono essere chiamati "script" dove my_func è la funzione che desideri chiamare esternamente.

Ecco un esempio di setup.py :

link

e un modulo richiamabile:

link

    
risposta data 28.01.2016 - 23:33
fonte
0

Se si intende far utilizzare il codice della libreria da altri pacchetti, è necessario separarlo dagli script. Ciò è dovuto al modo in cui le dipendenze sono dichiarate in setup.py e requirements.txt (vedi qui ) .

Se il codice della libreria verrà utilizzato solo con questi script, è possibile scegliere. Vorrei scegliere di tenerli insieme per mantenere le cose un po 'più semplici

    
risposta data 28.01.2016 - 21:45
fonte

Leggi altre domande sui tag