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.pydefine 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.pyen 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_1en 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_1en module_2.pyes 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.pyestá justo al lado module_2.py. Ahora dejo func_1()en module_1.pyalgo 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_1está en la misma jerarquía que él module_2.pymismo. Entonces, si no hay un punto, main.pyreconocerá module_1en 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.iniy 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.pyestá al lado main.py, están en la misma jerarquía, config.pyno están "debajo" main.pyo 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.