2009-06-16 6 views
10

Para mi solicitud de Python, que tienen la siguiente estructura de directorios:Cómo importar un módulo desde un directorio de nivel superior del script actual

\myapp 
\myapp\utils\ 
\myapp\utils\GChartWrapper\ 
\myapp\model\ 
\myapp\view\ 
\myapp\controller\ 

Uno de mi clase en \ miaplicacion \ vista \ debe importar una clase llamado GChartWrapper. Sin embargo, estoy consiguiendo un error de importación ...

myview.py 
from myapp.utils.GChartWrapper import * 

Aquí está el error:

<type 'exceptions.ImportError'>: No module named GChartWrapper.GChart 
     args = ('No module named GChartWrapper.GChart',) 
     message = 'No module named GChartWrapper.GChart' 

¿Qué estoy haciendo mal? Realmente tengo dificultades para importar módulos/clases en Python ...

Respuesta

7

El __init__.py file del paquete GChartWrapper espera que el paquete GChartWrapper en PYTHONPATH. Se puede decir que por la primera línea:

from GChartWrapper.GChart import * 

¿Es necesario tener la GChartWrapper paquete incluido en la estructura de directorios del paquete? Si es así, una cosa que podría hacer es agregar la ruta donde reside el paquete a sys.path en tiempo de ejecución. Supongo que myview.py está en el directorio myapp\view? Posteriormente, se podría hacer esto antes de importar GChartWrapper:

import sys 
import os 
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'utils'))) 

Si no es necesario tenerlo en su estructura de directorios, que podría ser más fácil de tenerlo instalado en la ubicación convencional. Puede hacerlo ejecutando el script setup.py que se incluye en la distribución fuente GChartWrapper.

+0

Estoy tratando de usar GChartWrapper en App Engine, por lo que realmente no puedo ejecutar la configuración. ¡Gracias! :) – Martin

2

Puede cambiar la ruta en la que python busca los archivos.

En la parte superior de su archivo de origen, agregue:

import sys 
sys.path.append("..") 

O, alternativamente, cambiar la variable de entorno:

export PYTHONPATH=.. 
5

No importa módulos y paquetes de caminos arbritary En cambio, en python que use paquetes e importaciones absolutas. Eso evitará todos los problemas futuros.

Ejemplo:

crear los siguientes archivos:

MyApp\myapp\__init__.py 
MyApp\myapp\utils\__init__.py 
MyApp\myapp\utils\charts.py 
MyApp\myapp\model\__init__.py 
MyApp\myapp\view\__init__.py 
MyApp\myapp\controller\__init__.py 
MyApp\run.py 
MyApp\setup.py 
MyApp\README 

Los archivos deben estar vacía a excepción de aquellos:

MyApp\myapp\utils\charts.py:

class GChartWrapper(object): 
    def __init__(self): 
     print "DEBUG: An instance of GChartWrapper is being created!" 

MyApp\myapp\view\__init__.py:

from myapp.utils.charts import GChartWrapper 

def start(): 
    c = GChartWrapper() # creating instance of the class 

MyApp\run.py:

from myapp.view import start 
start() 

Eso es todo! Cuando ejecuta su punto de entrada (run.py) llama a una función en la vista y crea una instancia de la clase GChartWrapper. Usando esta estructura puedes importar cualquier cosa en cualquier lugar y usarla.

Para complementar, en MyApp\setup.py, escriba un programa de instalación para el paquete MyApp \ myapp. Use distutils para escribirlo:

from distutils.core import setup 
setup(name='MyApp', 
     version='1.0', 
     description='My Beautiful Application', 
     author='Martin', 
     author_email='[email protected]', 
     url='http://stackoverflow.com/questions/1003843/', 
     packages=['myapp'], 
     scripts=['run.py'] 
    ) 

That is enough. Ahora, cuando las personas descargan la carpeta MyApp, pueden instalarla usando setup.py y ejecutarla usando run.py. Distutils puede generar paquetes en varios formatos, incluyendo Windows instalable .EXE

Es la forma estándar de distribución de paquetes/aplicaciones de python.

0

GChartWrapper también está disponible desde PyPI esta manera puede utilizar easy_install o pip para instalar el módulo:

sudo pip install GChartWrapper==0.9 

A continuación, se añadirá automáticamente a su PYTHONPATH y luego se puede quitar de su/myapp/utils directorio. Si no puede usar sudo, mire usando virtualenv (y virtualenvwrapper).

Cuestiones relacionadas