2012-02-21 29 views
69

Me está costando entender cómo funciona la importación de módulos en Python (nunca antes lo había hecho en otro idioma).No puedo importar mis propios módulos en Python

Digamos que tengo:

myapp/__init__.py 
myapp/myapp/myapp.py 
myapp/myapp/SomeObject.py 
myapp/tests/TestCase.py 

Ahora estoy tratando de conseguir algo como esto:

myapp.py 
=================== 
from myapp import SomeObject 
# stuff ... 

TestCase.py 
=================== 
from myapp import SomeObject 
# some tests on SomeObject 

Sin embargo, definitivamente estoy haciendo algo mal como Python no puede ver que myapp es un módulo:

ImportError: No module named myapp 

Respuesta

53

En su caso particular, parece que usted está tratando de importar SomeObject del myapp.py y TestCase.py scripts. Desde myapp.py, haga

import SomeObject 

ya que está en la misma carpeta. Para TestCase.py, hacer

from ..myapp import SomeObject 

Sin embargo, esto sólo funcionará si está importando TestCase del paquete. Si quiere ejecutar directamente python TestCase.py, tendría que meterse con su ruta. Esto se puede hacer dentro de Python:

import sys 
sys.path.append("..") 
from myapp import SomeObject 

aunque eso generalmente no se recomienda.

En general, si desea que otras personas usen su paquete de Python, debe usar distutils para crear un script de instalación. De esta forma, cualquiera puede instalar su paquete fácilmente usando un comando como python setup.py install y estará disponible en todas partes en su máquina. Si es serio sobre el paquete, incluso podría agregarlo al Python Package Index, PyPI.

+0

Intenté simplemente usar' import' en mi 'TestCase.py' pero aún así me dio el mismo error Supongo que es porque está en un subdirectorio de '__init __. Py'? – n0pe

+0

Oh, espera, creo que lo entiendo. Si mis casos de prueba están llamando desde el paquete, podré usar 'from ... import ...' right? – n0pe

+1

Solo lo hará si se está importando TestCase desde fuera del paquete; por ejemplo, si ejecuto 'from myapp.tests importo TestCase desde un script fuera de myapp. Si está ejecutando 'python TestCase.py' en la carpeta de pruebas, no puede hacer las importaciones relativas –

20

La función import busca fil es en tu PYTHONPATH env. variable y su directorio local. Por lo que puede poner todos los archivos en el mismo directorio, o exportar la ruta a escribir en un terminal ::

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/" 
+0

Entonces, ¿cómo puedo asegurarme de que funcione para todos los demás que lo usarían? Prefiero no tener que decirles que establezcan ciertas variables de entorno antes de ejecutarlo. – n0pe

+0

el directorio actual está en pythonpath, por lo que siempre que los scripts estén en la misma carpeta/directorio debería funcionar. desafortunadamente, cada uno de estos scripts está en directorios separados. – JKirchartz

+2

Para usuarios de Windows, en lugar de 'export' tenemos" set PYTHONPATH =% PYTHONPATH%; C: \ camino_a_myapp \ myapp \ myapp \ " –

8

ruta de exportación es una buena manera. Otra forma es agregar un .pth a su ubicación de paquetes de sitio. en mi Mac mi pitón mantiene site-packages en/Library/Python muestra a continuación

/Library/Python/2.7/site-packages 

he creado un archivo llamado awesome.pth en /Library/Python/2.7/site-packages/awesome.pth y en el archivo de poner la siguiente ruta que hace referencia a mis módulos impresionantes

/opt/awesome/custom_python_modules 
+1

en el caso de que esté trabajando en Windows, ¿cómo hago eso? –

+0

No estoy seguro. En el caso de que esté usando Windows. Encuentre algún software vm y use linux. O bien, vea esta respuesta sobre exportar variables en Windows. http://stackoverflow.com/questions/559816/how-to-export-and-import-environment-variables-in-windows – jmontross

+0

esto es exactamente lo que necesitaba – Lee88

2

Usted puede intentar

from myapp.myapp import SomeObject 

porque el nombre del proyecto es el mismo que el myapp.py que lo hace buscar el proyecto d primer documento

0

En su primer directorio myapp, puede agregar un archivo setup.py y agregar dos códigos python en la configuración.py

from setuptools import setup 
setup(name='myapp') 

en su primer directorio miaplicacion en la línea de comandos, utilice la pipa instalar -e. para instalar el paquete

Cuestiones relacionadas