2012-04-15 48 views
44

Tengo un módulo foo, que contiene util.py y bar.py.Importar el módulo de python NO en la ruta

Quiero importarlo en la sesión IDLE o python. ¿Cómo hago esto?

No pude encontrar documentación sobre cómo importar módulos que no están en el directorio actual o en la RUTA predeterminada de python. Después de probar import "<full path>/foo/util.py", y from "<full path>" import util

Lo más cerca que pude conseguir fue

import imp 
imp.load_source('foo.util','C:/.../dir/dir2/foo') 

Lo que me dio permiso denegado en Windows 7.

+0

También vale la pena echarle un vistazo a esta [pregunta relacionada] (http://stackoverflow.com/questions/15109548/set-pythonpath-before-import-statements). En particular, me gusta la [respuesta superior] (http://stackoverflow.com/a/15109660/95852) allí, por su claridad sobre la seguridad de los cambios a 'sys.path'. –

+0

Posible duplicado de [Cómo importar un módulo dado el camino completo?] (Http://stackoverflow.com/questions/67631/how-to-import-a-module-given-the-full-path) –

Respuesta

62

Una forma es simplemente modificar su path:

import sys 
sys.path.append('C:/full/path') 
from foo import util,bar 

Tenga en cuenta que esto requiere foo ser un paquete python, es decir, contienen un archivo __init__.py. Si no desea modificar sys.path, puede also modify the PYTHONPATH environment variable o install the module on your system. Tenga en cuenta que esto significa que otros directorios o archivos .py en ese directorio pueden cargarse inadvertidamente.

Por lo tanto, es posible que desee utilizar imp.load_source en su lugar. Se necesita el nombre del archivo, no un directorio (en un archivo que se permite que el usuario actual para leer):

import imp 
util = imp.load_source('util', 'C:/full/path/foo/util.py') 
+0

Funciona, pero ahora cuando se intenta utilizar el método util utilizando el método, dice 'método' no definido. Pero puedo usarlo por util.method. ¿Por qué? – Vort3x

+2

Porque no ha definido 'method', solo" the 'method' en' util' ". Puede definir 'method = util.method' si lo desea. – katrielalex

+0

Tenga en cuenta que 'from foo import *' es una codificación incorrecta a menos que esté pirateando el shell. – katrielalex

5

Se puede personalizar la ruta de búsqueda de módulo utilizando la variable de entorno PYTHONPATH , o modificar manualmente la lista de directorios sys.path.

Consulte la documentación de Module Search Path en python.org.

2

seguirlo

import sys 
sys.path.append('c:/.../dir/dir2') 
import foo 
+1

-1 Porque anexar a la ruta Python es una mala solución. Funciona, pero es estrictamente peor que imp.load_source porque el usuario puede no querer modificar las rutas del sistema, o puede estar trabajando en una computadora donde él o ella no puede hacerlo. Esta es en realidad una de las "características" más molestas en Python, que de lo contrario es un lenguaje elegante. Es una tontería que no puedas simplemente importar una cadena nombrando una ruta a otro archivo .py.Y dado que no se puede, la protección contra el cambio de las rutas del sistema mediante el uso de imp es estrictamente mejor. – ely

+1

@EMS Ah ... Veo lo que estás diciendo, no me había dado cuenta antes, pero ahora el punto es claro. Gracias por señalar esto. (Quizás tenga que modificar parte de mi propio código ahora :) – Levon

+3

No se preocupe. Este es el propósito previsto de 'sys.path' (o al menos * un * caso de uso previsto). El Sr. F (que aparentemente era anteriormente EMS) está equivocado. Como phihag señala en su respuesta al comentario -1 idéntico en su respuesta, 'sys.path' * no * está relacionado con la ruta del sistema general. –

1

Siguiendo punta de phihag, tengo esta solución. Simplemente indique la ruta de un archivo fuente al load_src y lo cargará. También debe proporcionar un nombre, para que pueda importar este módulo con este nombre. Yo prefiero hacerlo de esta manera porque es más explícito:

def load_src(name, fpath): 
    import os, imp 
    return imp.load_source(name, os.path.join(os.path.dirname(__file__), fpath)) 

load_src("util", "../util.py") 
import util 

print util.method() 

Otra manera (menos explícito) es la siguiente:

util = load_src("util", "../util.py") # "import util" is implied here 

print util.method() # works, util was imported by the previous line 

Editar: el método se reescribe para hacerlo más claro.

Cuestiones relacionadas