Ho uno script python, che dovrebbe leggere una sottodirectory e rendere tutti gli script al suo interno richiamabili in questo modo:
python mainscript.py subscript arguments
Ho capito la maggior parte dei dettagli, ma sto avendo molti problemi a decidere come esportare un'API (oggetto o funzioni selezionate) su subscript
s che mainscript
importa. L'intenzione è che subscript
s funzioni come comandi inseribili in mainscript
(in altre parole, non è necessario che funzionino autonomamente).
Le cose che ho provato, che penso sarebbe abbastanza elegante sono (dopo import subdirectory.subscript
in mainscript
):
-
import __main__
che funziona, ma dà al mio sottoscrittore l'accesso a tutto incondizionatamente e sarà probabilmente una fonte di bug orribili se questo deve essere usato da altri.
-
from __main__ import *
che non funziona nonostante definisca
__all__
per includere il nomeapi
alla fine dimainscript
(mi viene appena detto chename 'api' is not defined
quando provo a fare riferimento all'oggetto che voglio). -
from __main__ import api
che mi dice
cannot import name api
.
Quindi mi trovo in una posizione in cui, o faccio lo scomodo import __main__
che non mi piace per niente, o devo spostare l'api in un altro file, cosa che non mi piace perché romperebbe l'intento struttura di:
mainscript.py
- subdirectory:
- subscript:
subscript.py
che, nonostante i file __init__.py
che devono essere ovunque lungo la catena, è relativamente semplice con cui lavorare. Un api.py
da qualche parte significherebbe che, per mantenere la semplicità, dovrei spostare mainscript.py
e api.py
nella loro sottodirectory e avere uno script chiamante dove mainscript.py
usato per essere (uno script python, per mantenere le cose facilmente multipiattaforma, ma aggiunge semplicemente un altro script alla catena). Voglio mantenere tutto semplice ed evidente, ed è per questo che preferirei avere la semplice api all'interno dello script del chiamante master.
In sintesi: qual è il modo consigliato, se esiste, per esportare un oggetto api da uno script chiamante a script chiamati? Questo approccio all'esportazione di un'API è sbagliato?