Estoy intentando modificar el sys.path en uno de mis archivos de Python para tener algunas direcciones de bibliotecas específicas en la ruta de búsqueda de módulos (puede que no sea la mejor manera pero …). Si inserto varias rutas en el frente de sys.path, mi secuencia de comandos no tiene en cuenta esas rutas para futuras importaciones. Si hago una lista completamente nueva que contiene los directorios de bibliotecas que necesito y asigno esa lista a sys.path, entonces esas importaciones se tienen en cuenta. ¿Es este el comportamiento correcto? Estoy usando python 2.5.4. ¿Podría ser algo de mi entorno que podría conducir a tal comportamiento?
Algunos fragmentos de código: si lo hago
pathtoInsert1 = " .... " pathtoInsert2 = " .... " sys.path.insert(0, pathToInsert1) sys.path.insert(0, pathToInsert2)
No funciona. No tiene en cuenta los caminos.
Si lo hago
pathList = [pathToInsert1, pathToInsert2] sys.path = pathList
funciona.
Gracias
Realmente necesitas publicar algún código para que podamos ayudarte. Sin embargo, puedo hacer una conjetura educada. Usted dice que si hace una lista completamente nueva y la asigna a sys.path, entonces funciona. Supongo que quieres decir que estás haciendo algo como esto
sys.path = ["dir1", "dir2", ...]
Pero si inserta las rutas al principio no funcionará. Mi conjetura es que estás usando el método de inserción, como tal
sys.path.insert(0, ["dir1", "dir2"])
Si es así, entonces esto es incorrecto. Esto crearía una lista que parece
[["dir1", "dir2"], "dir3", ...]
En su lugar deberias decir
sys.path[:0] = ["dir1", "dir2"]
que te dará
["dir1", "dir2", "dir3", ...]
Pero esto es todo conjeturas hasta que publique su código.
Ejemplo de actualización de sys.path tomado desde aquí
import sys sys.path.append("/home/me/mypy")
Esto funcionó para mí.
¿Cómo estás “insertando” los caminos adicionales?
La modificación de la ruta se realiza de la misma manera que se modifica cualquier otra lista en Python, aunque suena como si simplemente la estuvieras obstruyendo al reasignarla.
Ejemplo de actualización de sys.path: http://www.johnny-lin.com/cdat_tips/tips_pylang/path.html
Acabo de tener un problema similar mientras trabajaba en iPython con módulos que se distribuyen en varios directorios. En ese caso, para que la importación funcione, uno debe asegurarse de que el module.__path__
de los módulos con __init__.py
distribuido incluye todos los directorios donde está uno de los __init__.py
del módulo, así como asegurarse de que el directorio correcto esté en el sys Lista de rutas.
Por ejemplo, tengo un módulo llamado foo, que contiene un módulo llamado barra que se distribuye en varios directorios:
aerith/foo/bar/__init__.py aerith/foo/bar/baz/__init__.py bob/foo/bar/__init__.py bob/foo/bar/baf/__init__.py carol/foo/bar/__init__.py carol/foo/bar/quux/__init__.py
En iPython, ya había importado baz and baf, y quería importar quux.
from foo.bar import quux
Esto dio un ImportError, porque carol
no estaba en sys.path
, pero sys.path.append('carol')
no solucionó el ImportError.
Lo que se requería era informar al módulo de bar
que uno de sus __init__.py
podía encontrar en ‘carol / foo / bar’.
foo.bar.__path__.append('carol/foo/bar') from foo.bar import quux