2012-07-23 11 views
21

Al organizar proyectos pitón, esta estructura parece ser una forma estándar de hacerlo:Cómo importar su paquete/módulos a partir de una secuencia de comandos en la carpeta bin en Python

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

Mi pregunta es, ¿Cómo se importan mycore.py para que pueda usarlo en myscript?

both __init__.py archivos están vacíos.

contenido de miscript:

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

contenido de core.py

def main(): 
    print 'hello' 

Cuando corro miscript desde el interior del directorio miproyecto, me sale el siguiente error:

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

Lo ¿Me estoy perdiendo?

+0

El valor de 'sys.path' (modificado por la variable de entorno' PYTHONPATH' o en tiempo de ejecución por el código de Python) determina dónde 'import' buscará los módulos. – Borealid

+2

Considere usar 'entry_points [" console_scripts "] '' en 'setup.py'. – kojiro

+1

¿Cuáles son los contenidos de 'setup.py'? ¿Y está en el directorio myproject? – mgilson

Respuesta

4

Normalmente, setup.py debe instalar el paquete en un lugar donde el intérprete de Python puede encontrarlo, por lo que después de la instalación import mypackage funcionará. Para facilitar la ejecución de las secuencias de comandos en bin directamente desde el árbol de desarrollo, normalmente solo agrego un enlace a ../mypackage/ en el directorio bin. Por supuesto, esto requiere un sistema de archivos de soporte enlaces simbólicos ...

+0

Usando el enlace simbólico como sugirió, el script pudo encontrar mi paquete, pero ahora me encontré con otro problema ... Vea mi edición anterior en la pregunta . –

+6

En lugar de utilizar enlaces simbólicos "inteligentes" con el desarrollo, use un [virtualenv] (http://pypi.python.org/pypi/virtualenv/) y ejecute 'python setup.py develop' para que distutils instale el ejecutable en su ruta (cuando has activado ese virtualenv) – SingleNegationElimination

+0

En realidad, me di cuenta de ese otro problema. –

0

No estoy seguro de si hay una "mejor opción", pero el siguiente es mi práctica normal:

  1. poner lo que la escritura Quiero correr en/bin

  2. hacer "python -m bin.script" en el directorio miproyecto

  3. al importar en script.py, considere el directorio en el que está sentado script.py como root. Así

    from ..mypackage import core 
    

Si el sistema es compatible con enlace simbólico, que es una mejor opción.

Cuestiones relacionadas