no puedo hacer que esto funcione..
Mi estructura es:
program_name/ __init__.py setup.py src/ __init__.py Process/ __init__.py thefile.py tests/ __init__.py thetest.pylaprueba.py:
from ..src.Process.thefile.py import sth Ejecutando: pytest ./tests/thetest.py from program_name da:
ValueError: attempted relative import beyond top-level package
También probé otros enfoques, pero recibo varios errores.
Pero espero que lo anterior funcione.
ValueError: Intento de importación relativa en no paquete
Indica que está tratando de usar la importación relativa en el módulo, que se usará para paquetes, es decir, para convertirlo en un paquete, agregue __init__.py y llame a thetest.py desde algún archivo fuera del paquete. Ejecutar directamente thetest.py desde el intérprete no funcionará.
Las importaciones relativas requieren que el módulo que las utiliza se importe como módulo de paquete.
Sugerencia 1 :
El directorio de tests actual tiene un archivo __init__.py , pero eso no le permite ejecutarlo como un módulo (a través de shell); para que su importación actual (relativa) funcione, debe importarla en un externo (al paquete) archivo/módulo: creemos un main.py (puede nombrarlo como desee):
main.py program_name/ __init__.py setup.py src/ __init__.py Process/ __init__.py thefile.py tests/ __init__.py thetest.pysrc/Process/ thefile.py :
s = 'Hello world'pruebas/ laprueba.py :
from ..src.Process.thefile import s print sprincipal.py :
from program_name.tests.thetest import sEjecutando main.py :
[nahmed@localhost ~]$ python main.py Hello worldSugerencia 2 :
Ejecute el archivo justo encima del directorio raíz, es decir, un nivel por encima de program_name/ , de la siguiente manera:
[nahmed@localhost ~]$ python -m program_name.tests.thetest Hell WorldPD las importaciones relativas son para paquetes, no para módulos.
Acabo de resolver un problema similar con un montón de google. Aquí hay dos soluciones sin cambiar el estructurador de archivos existente:
La forma de importar un módulo desde la carpeta principal from ..src.Process.thefile.py import sth se denomina "importación relativa".
Solo se admite cuando se inicia como un paquete desde el paquete de nivel superior. En su caso, eso es iniciar la línea de comando desde el directorio que contiene program_name/ y type (para el entorno win)
python -m program_name.tests.thetesto simplemente (útil para muchos archivos pytest):
python -m pytestDe lo contrario, cuando intente ejecutar un script solo o desde un paquete que no sea de nivel superior, puede agregar manualmente el directorio a PYTHONPATH en tiempo de ejecución.
import sys from os import path sys.path.append(path.dirname(path.dirname(path.abspath(__file__)))) from src.Process.thefile import sPruebe primero el primero para ver si es compatible con el marco pytest. De lo contrario, el segundo siempre debería resolver el problema.
Referencia ( Cómo arreglar "Intento de importación relativa en un paquete que no es" incluso con __init__.py )
Al importar un archivo, Python solo busca en el directorio actual, el directorio desde el que se ejecuta el script de punto de entrada. puede usar sys.path para incluir diferentes ubicaciones
import sys sys.path.insert(0, '/path/to/application/app/folder') import thefile