No tengo experiencia con Python, así que si hay algún error en mis palabras, solo dígame. Si su jerarquía de archivos se organizó así:
project\
module_1.py
module_2.py
module_1.py
define una función llamada func_1()
, module_2.py :
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
y ejecuta python module_2.py
en cmd, ejecutará lo que func_1()
define. Así es como importamos los mismos archivos de jerarquía. Pero cuando se escribe from .module_1 import func_1
en module_2.py
, intérprete de python dirá No module named '__main__.module_1'; '__main__' is not a package
. Entonces, para solucionar esto, simplemente conservamos el cambio que acabamos de hacer, y movemos ambos módulos a un paquete, y hacemos que se ejecute un tercer módulo como llamador module_2.py
.
project\
package_1\
module_1.py
module_2.py
main.py
main.py :
from package_1.module_2 import func_2
def func_3():
func_2()
if __name__ == '__main__':
func_3()
Pero la razón por la que agregamos un .
antes module_1
en module_2.py
es que si no hacemos eso y corremos main.py
, el intérprete de Python dirá No module named 'module_1'
, eso es un poco complicado, module_1.py
está justo al lado module_2.py
. Ahora dejo func_1()
en module_1.py
algo Do:
def func_1():
print(__name__)
que __name__
registra quién llama a func_1. Ahora guardamos el .
antes module_1
, corre main.py
, se imprimirá package_1.module_1
, no module_1
. Indica que quien llama func_1()
está en la misma jerarquía que main.py
, lo .
que implica que module_1
está en la misma jerarquía que él module_2.py
mismo. Entonces, si no hay un punto, main.py
reconocerá module_1
en la misma jerarquía que sí mismo, puede reconocerpackage_1
, pero no qué "debajo" de él.
Ahora hagámoslo un poco complicado. Tiene un config.ini
y un módulo define una función para leerlo en la misma jerarquía que 'main.py'.
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Y por alguna razón inevitable, debe llamarlo module_2.py
, por lo que debe importar desde la jerarquía superior. module_2.py :
import ..config
pass
Dos puntos significa importar desde la jerarquía superior (acceso de tres puntos superior a superior, etc.). Ahora corremos main.py
, el intérprete dirá: ValueError:attempted relative import beyond top-level package
. El "paquete de nivel superior" aquí es main.py
. Solo porque config.py
está al lado main.py
, están en la misma jerarquía, config.py
no están "debajo" main.py
o no están "guiados" main.py
, por lo que está más allá main.py
. Para solucionar esto, la forma más simple es:
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Creo que eso coincide con el principio de organizar la jerarquía de archivos del proyecto, debe organizar los módulos con diferentes funciones en diferentes carpetas, y simplemente dejar una llamada superior en el exterior, y puede importar lo que quiera.