2009-10-18 12 views
7

Ho recentemente portato il mio progetto Python in esecuzione su Python 3.1. Per questo ho dovuto adottare la politica delle importazioni relative all'interno dei sottomoduli e dei sotto-pacchetti del mio progetto. Non l'ho fatto e ora il progetto stesso funziona, ma ho notato che non posso eseguire nessuno dei sotto-pacchetti o dei sottomoduli in esso contenuti. Se provo, ottengo "builtins.ValueError: Tentativo importazione relativa in non-pacchetto". Posso solo importare l'intero progetto.Python: le importazioni relative significano che non è possibile eseguire un sottopacchetto da solo?

È normale?

risposta

3

Puoi usare -m flag dell'interprete python per eseguire i moduli in sotto-pacchetti (o anche pacchetti in 3.1.).

+0

Direi che * deve * usare l'opzione '-m'; non è che * puoi *. Mi piace chiamare i file Python direttamente, perché non ho bisogno di ricordare lo switch e la mia shell si completa automaticamente. –

+0

Vedere questa risposta se sei interessante nell'esecuzione di uno script python eseguibile da un sottomodulo: http://stackoverflow.com/a/11537218/730150 – krumpelstiltskin

4

Sì, è normale. Se si desidera eseguire un modulo che è anche parte di un pacchetto (di per sé una cosa strana da fare) è necessario avere importazioni assolute. Quando si esegue il modulo non è, dal punto di vista degli interpreti, una parte di un pacchetto, ma il modulo __main__. Quindi non saprebbe dove sono i pacchetti relativi.

Il metodo standard per farlo è quello di avere le funzioni nei pacchetti e gli script eseguibili separati che chiamano le funzioni, in quanto ciò consente di mettere gli script eseguibili all'esterno del modulo, per esempio in/usr/bin

+1

Wow, ho trovato questa filosofia strano. Ad esempio, ho nel mio progetto un pacchetto 'vita'. Il suo percorso assoluto è 'garlicsim.bundled.simulation_packages.life'. Mi sarebbe piaciuto essere in grado di eseguirlo da solo, poiché non dipende da nulla in 'garlicsim'. Perché non dovrei essere in grado di eseguirlo da solo? –

+0

1. Se non dipende da nulla in garlicsim, allora perché è in garlicsim? 2. Perché non saresti in grado di eseguirlo da solo? Puoi eseguirlo da solo, ma devi importare in modo assoluto, cioè da garlicsim.bundled.simulation_packages.life importa qualunque cosa. 3. Qual è la filosofia che trovi strana? Non ho menzionato alcuna filosofia, quindi non so quale sia questa "filosofia". –

+3

1. È solo un pacchetto. Ma potrei fare un altro esempio di "garlicsim.asynchronous_crunching.crunchers', che è un sotto-pacchetto di cui garlicsim dipende, ma non dipende da garlicsim. (2) Dire se un giorno desidero spostarlo su un altro pacchetto, perché non dovrei essere in grado di, senza il trambusto di modificare le righe di importazione? (3) Forse avrei dovuto dire "politica" anziché "filosofia". Questo atteggiamento, di essere in grado di (a) eseguire il pacchetto indipendentemente, o (b) portarlo facilmente ad altri pacchetti, ma non entrambi. –

-1

Ho avuto il same problem e ho considerato l'interruttore -m troppo difficile.

Invece Io uso questo:

try: 
    from . import bar 
except ValueError: 
    import bar 

if __name__ == "__main__": 
    pass 
+0

Le importazioni relative implicite sono deprecate e rimosse in python 2.7. – habnabit

+0

Arron, hai ragione ma non vedo come questo cambi la mia soluzione. Funziona con qualsiasi python 2.5-3.1. – sorin

+0

no, questo non funziona in 3.x. È stato rimosso in 2.7+, che include 3.0-3.1. – habnabit

Problemi correlati