Estoy intentando ejecutar un módulo desde la consola. La estructura de mi directorio es esta:
Estoy tratando de ejecutar el módulo p_03_using_bisection_search.py
, desde el directorio problem_set_02
usando:
$ python3 p_03_using_bisection_search.py
El código dentro de p_03_using_bisection_search.py
es:
__author__ = 'm'
from .p_02_paying_debt_off_in_a_year import compute_balance_after
def compute_bounds(balance: float,
annual_interest_rate: float) -> (float, float):
# there is code here, but I have omitted it to save space
pass
def compute_lowest_payment(balance: float,
annual_interest_rate: float) -> float:
# there is code here, but I have omitted it to save space
pass
def main():
balance = eval(input('Enter the initial balance: '))
annual_interest_rate = eval(input('Enter the annual interest rate: '))
lowest_payment = compute_lowest_payment(balance, annual_interest_rate)
print('Lowest Payment: ' + str(lowest_payment))
if __name__ == '__main__':
main()
Estoy importando una función que está en p_02_pagar_deuda_en_un_año.py
cuyo código es:
__author__ = 'm'
def compute_balance(balance: float,
fixed_payment: float,
annual_interest_rate: float) -> float:
# this is code that has been omitted
pass
def compute_balance_after(balance: float,
fixed_payment: float,
annual_interest_rate: float,
months: int=12) -> float:
# Omitted code
pass
def compute_fixed_monthly_payment(balance: float,
annual_interest_rate: float) -> float:
# omitted code
pass
def main():
balance = eval(input('Enter the initial balance: '))
annual_interest_rate = eval(
input('Enter the annual interest rate as a decimal: '))
lowest_payment = compute_fixed_monthly_payment(balance,
annual_interest_rate)
print('Lowest Payment: ' + str(lowest_payment))
if __name__ == '__main__':
main()
Estoy recibiendo el siguiente error:
ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package
No tengo ni idea de cómo resolver este problema. He intentado añadir un archivo __init__.py
, pero sigue sin funcionar.
Tengo el mismo problema que tú. Creo que el problema es que has usado relative import en in-package import
. No hay __init__.py
en tu directorio. Así que sólo importa como respondió Moisés arriba.
El problema principal creo que es cuando importas con un punto:
from .p_02_paying_debt_off_in_a_year import compute_balance_after
Equivale a:
from __main__.p_02_pagar_deuda_en_un_año import compute_balance_after
donde __main__
se refiere a su módulo actual p_03_usando_búsqueda_de_bisección.py
.
Brevemente, el intérprete no conoce su arquitectura de directorios.
Cuando el intérprete se mete en p_03.py
, el script es igual:
from p_03_usando_bisección_búsqueda.p_02_pagando_deuda_en_un_año import compute_balance_after
y p_03_using_bisection_search
no contiene ningún módulo o instancia llamado p_02_paying_debt_off_in_a_year
.
Así que se me ocurrió una solución más limpia sin cambiar los valores del entorno de python (después de buscar cómo hacen requests en la importación relativa):
La arquitectura principal del directorio es:
main.py
setup.py
---problema_02/
------__init__.py
------p01.py
------p02.py
------p03.py
Luego escribe en __init__.py
:
from .p_02_pagar_la_deuda_en_un_año import compute_balance_after
Aquí __main__
es __init__
, se refiere exactamente al módulo problem_set_02
.
Entonces ve a main.py
:
importar conjunto_de_problemas_02
También puedes escribir un setup.py
para añadir un módulo específico al entorno.
Hola. Siga los pasos que se indican a continuación y resolverá el problema.
Si ha creado un directorio y un subdirectorio, siga los siguientes pasos y tenga en cuenta que todos los directorios deben tener __init__.py
para que sean reconocidos como un directorio.
Si no se ha creado un directorio y un sub-directorio, siga los siguientes pasos y por favor tenga en cuenta que todos los directorios deben tener __init__.py
para que sean reconocidos como directorios. 1. Importe sysy ejecute
sys.path`, podrá ver todas las rutas que están siendo buscadas por python.
Ahora importa el subdirectorio y el módulo respectivo que quieras usar usando import sigue este comando: importar subdir.subdir.modulename como abc
y ahora usted puede utilizar los métodos en ese módulo.
ScreenShotforSameIssue
como puedes ver en esta captura de pantalla tengo un directorio padre y dos subdirectorios y bajo el segundo subdirectorio tengo module==CommonFunction y ves a la derecha después de la ejecución de sys.path puedo ver mi directorio de trabajo