top non from beyond attempted another python import python-2.x relative

non - python import module from path



Cómo lograr una importación relativa en Python (5)

Desde el PEP parece que no puede usar una importación relativa para importar un archivo que no está empaquetado.

Por lo tanto, deberías agregar un __init__.py a cosas y cambiar tus importaciones a algo como from .mylib import *

Sin embargo, el PEP parece no permitir que mylib esté empaquetado en un módulo. Por lo tanto, es posible que deba cambiar la forma en que llama a las funciones de la biblioteca.

Otra alternativa es mover mylib a un subpaquete e importarlo from .libpackage import mylib

stuff/ __init__.py mylib.py Foo/ __init__.py main.py foo/ __init__.py script.py

script.py quiere importar mylib.py

Esto es solo un ejemplo, pero realmente solo quiero hacer una importación relativa de un módulo en un directorio principal. He intentado varias cosas y obtengo este error ...

Attempted relative import beyond toplevel package

Leí en alguna parte que la secuencia de comandos desde donde se inicia el programa no debería estar en el paquete, e intenté modificar la estructura para eso así ...

stuff/ mylib.py foo.py // equivalent of main.py in above foo/ __init__.py script.py

pero tiene el mismo error.

¿Cómo puedo lograr esto? ¿Es esto incluso un enfoque adecuado?

Edición: En Python 2


Después de jugar un poco más con él, me di cuenta de cómo configurarlo, y por razones de especificidad no usaré nombres de barras de foo. El directorio de mi proyecto está configurado como ...

tools/ core/ object_editor/ # files that need to use ntlib.py editor.py # see example at bottom __init__.py state_editor/ # files that need to use ntlib.py __init__.py ntlib.py __init__.py # core is the top level package LICENSE state_editor.py # equivalent to main.py for the state editor object_editor.py # equivalent to main.py for the object editor

Una línea en object_editor.py parece a ...

from core.object_editor import editor

Una línea en editor.py parece a ...

from .. import ntlib

o alternativamente

from core import ntlib

La clave es que en el ejemplo que di en la pregunta, el script "principal" se ejecutaba desde el paquete. Una vez que lo moví, creé un paquete específico ( core ), y moví la biblioteca que quería que los editores compartieran ( ntlib ) en ese paquete, todo era Hunky-Dory.


Estoy ejecutando Python 3.4.2 en Windows 7 y arranqué mi cabello por esto.

Al ejecutar cualquiera de estos:

python -m unittest python -m unittest descubrir

... Obtendría el error ''Intenté la importación relativa más allá del paquete de nivel superior''.

Para mí, la solución fue soltar el ".." en mi [test_stock.py]. La línea era: a partir de ... stock de stock de importación

Se cambió a: desde stock importación Stock

.. y funciona.

Estructura de la carpeta:

C:/ | +-- stock_alerter | +-- __init__.py +-- stock.py | /-- tests | +-- __init__.py /-- test_stock.py


aunque mientras "cosas" no estén en tu Python PATH, no tienes más remedio que agregar la ruta.

Si conoces el nivel de tu script.py de cosas que puedes hacer, por ejemplo:

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


import ..foo..stuff.mylib debería estar bien

EDIT quitó la extensión