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 nomeapialla fine dimainscript(mi viene appena detto chename 'api' is not definedquando provo a fare riferimento all'oggetto che voglio). -
from __main__ import apiche 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?