2012-07-23 12 views
21

Nell'organizzare progetto pitone, questa struttura sembra essere un modo standard per farlo:Come importare il pacchetto/i moduli da uno script nella cartella bin in python

myproject\ 
    bin\ 
     myscript 
    mypackage\ 
     __init__.py 
     core.py 
    tests\ 
     __init__.py 
     mypackage_tests.py 
setup.py 

La mia domanda è, come faccio a importare mycore.py quindi posso usarlo in myscript?

entrambi i file __init__.py sono vuoti.

Contenuto MyScript:

#!/usr/bin/env python 
from mypackage import core 
if __name__ == '__main__': 
    core.main() 

Contenuto core.py

def main(): 
    print 'hello' 

Quando eseguo myscript dall'interno directory myproject, ottengo il seguente errore:

Traceback (most recent call last): 
    File "bin/myscript", line 2, in <module> 
    from mypackage import core 
ImportError: No module named mypackage 

Cosa mi sto perdendo?

+0

Il valore 'sys.path' (modificato dalla variabile di ambiente' PYTHONPATH' o in fase di esecuzione dal codice Python) determina dove 'import' cercherà i moduli. – Borealid

+2

Considera l'uso di 'entry_points [" console_scripts "] '' in 'setup.py'. – kojiro

+1

Quali sono i contenuti di 'setup.py'? Ed è nella directory di myproject? – mgilson

risposta

4

In genere, setup.py deve installare il pacchetto in un posto dove l'interprete Python può trovarlo, quindi dopo l'installazione import mypackage funzionerà. Per facilitare l'esecuzione degli script in bin direttamente dall'albero di sviluppo, di solito aggiungo semplicemente un simlink aalla directory bin. Naturalmente, questo richiede un filesystem di supporto link simbolici ...

+0

Usando il collegamento simbolico come suggerito, lo script è riuscito a trovare il mypackage, ma ora ho trovato un altro problema ... Vedi la mia modifica sopra nella domanda . –

+6

Invece di usare collegamenti simbolici "intelligenti" con lo sviluppo, usa un [virtualenv] (http://pypi.python.org/pypi/virtualenv/) ed esegui 'python setup.py develop' per fare in modo che distutils installi l'eseguibile nel tuo percorso (quando hai attivato quella virtualenv) – SingleNegationElimination

+0

In realtà, ho capito che l'altro problema. –

0

non sono sicuro se v'è una "scelta migliore", ma ciò che segue è la mia pratica normale:

  1. mettere quello sceneggiatura Voglio correre in/bin

  2. fare "python -m bin.script" nella directory myproject

  3. Quando si importano in script.py, prendere in considerazione la dir in cui script.py è seduto come root. Così

    from ..mypackage import core 
    

Se il sistema supporta link simbolico, si tratta di una scelta migliore.

Problemi correlati