Tengo mi código python en una carpeta llamada "proyecto", por lo que mis archivos de código están en project/*. Py. Quiero tener submódulos dentro de él, p.pythonic module organization - ¿cómo hacer referencia a los archivos en el directorio raíz?
project/code.py # where code lives
project/mymodule1 # where more code lives
project/mymodule2
cada directorio módulo tiene su propio init archivo .py, por ejemplo,
project/mymodule1/__init__.py
supongamos que tengo un archivo "test.py" dentro mymodule1 (proyecto/mymodule1/test.py) y me gustaría hacer referencia a algo de "código", por ejemplo, importar la función "myfunc"
== project/mymodule1/test.py ==
from code import myfunc
el problema es que el "código" no se encontrará a menos que el usuario ha colocado el directorio "/ Proyecto de" en su PYTHONPATH. ¿Hay alguna forma de evitar esto y utilizar algún tipo de "ruta relativa" para importar myfunc, p.
from ../code import myfunc
básicamente, no quiero obligar a los usuarios del código de alterar el PYTHONPATH a menos que pueda hacerlo mediante programación para ellos desde dentro de mi guión. Me gustaría que funcione de la caja.
¿Cómo se puede hacer esto? cualquiera de las soluciones es buena: alterar PYTHONPATH mediante programación, o más idealmente, referirme a "código" usando algún tipo de importación relativa, ya que aunque no sé dónde vive "project/code.py" en la computadora del usuario, sé dónde es relativo a "myfunc".
EDITAR: ¿Alguien puede mostrar el ejemplo correcto de importación dentro del paquete? He intentado, desde "mymodule1" hacer:
from .. import foo
donde "foo" está en code.py pero no funciona. Tengo init .py en mymodule1, por lo que:
project/code.py
project/mymodule1/__init__.py
project/mymodule1/module1_code.py
donde module1_code.py intenta importar foo, una función definida en "code.py".
EDITAR: La principal confusión que todavía tengo es que incluso después de adoptar el ejemplo dado en respuesta a mi mensaje, mostrando la jerarquía de proyecto/sub1/prueba, todavía no puede "cd" en sub1 y hacer "python test.py "y haz que funcione". El usuario debe estar en el directorio que contiene "project" y hacer "import project.sub1.test". Me gustaría que esto funcione independientemente del directorio en el que se encuentre el usuario. El usuario en este caso debe ejecutar el archivo "test.py", que vive en el proyecto/sub1 /. Por lo que el caso de prueba es:
$ cd project/sub1
$ python test.py
que produce el error:
ValueError: Attempted relative import in non-package
¿Cómo puede ser fijo?
gracias.
¿'code.py' también está importando' mymodule1/test.py'? Si es así, querrás ver reorganizar tu código. Las importaciones circulares deben evitarse si es posible. – Wilduck