Estoy tratando de 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 elproblem_set_02
directorio usando:
$ python3 p_03_using_bisection_search.py
El código dentro 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_paying_debt_off_in_a_year.py
el código:
__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 teniendo el siguiente error:
ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package
No tengo idea de cómo resolver este problema. Intenté agregar un __init__.py
archivo, pero todavía no funciona.
python
module
python-3.6
python-import
lmiguelvargasf
fuente
fuente
eval(input...
probablemente no sea una gran idea. Simplemente lo analizaría en lugar de abrir la oportunidad para la ejecución de código arbitrario.eval(input(...
bit fue sugerido por 2to3. Tenía que hacerme eso hoy. contento de no seguirla de sugerencias blindlingRespuestas:
Simplemente elimine el punto para la importación relativa y haga:
fuente
__init__.py
?__init__.py
en la misma carpeta), aunque mi PyCharm (2018.2.4) marca esto como una "Referencia no resuelta" y no puede completar automáticamente la importación.from ..sibling_pkg.nephew import my_function
es válido para PyCharm, pero da como resultadoValueError: attempted relative import beyond top-level package
y MyPyCannot find module named '.sibling_pkg.nephew'
(tenga en cuenta un solo "." En el error, no dos). Sin embargo,from sibling_pkg.nephew import my_function
funciona según lo previsto, no tiene un error MyPy, pero da como resultado un error PyCharm.Tengo el mismo problema que tú. Creo que el problema es que usaste importación relativa
in-package import
. No hay__init__.py
en su directorio. Tan solo importa como Moisés respondió arriba.Creo que el problema principal es cuando importas con un punto:
Es equivalente a:
donde se
__main__
refiere a su módulo actualp_03_using_bisection_search.py
.Brevemente, el intérprete no conoce la arquitectura de su directorio.
Cuando entra el intérprete
p_03.py
, el guión es igual a:y
p_03_using_bisection_search
no contiene ningún módulo o instancia llamadap_02_paying_debt_off_in_a_year
.Así que se me ocurrió una solución más limpia sin cambiar los objetos de valor del entorno de Python (después de consultar cómo funcionan las solicitudes en la importación relativa):
La arquitectura principal del directorio es:
main.py
setup.py
---
problem_set_02/
------
__init__.py
------
p01.py
------
p02.py
------
p03.py
Luego escribe en
__init__.py
:Aquí
__main__
está__init__
, se refiere exactamente al móduloproblem_set_02
.Luego ve a
main.py
:import problem_set_02
También puede escribir un
setup.py
para agregar un módulo específico al entorno.fuente
Intenta ejecutarlo como:
python3 -m p_03_using_bisection_search
fuente
Si ha creado un directorio y un subdirectorio, siga los pasos a continuación y tenga en cuenta que todo el directorio debe tener
__init__.py
para que sea reconocido como un directorio.En su secuencia de comandos, incluya
import sys
ysys.path
, podrá ver todas las rutas disponibles para Python. Debe poder ver su directorio de trabajo actual.Ahora importe el subdirectorio y el módulo respectivo que desea usar:
import subdir.subdir.modulename as abc
y ahora puede usar los métodos en ese módulo.Como ejemplo, puede ver en esta captura de pantalla que tengo un directorio principal y dos subdirectorios y en el segundo subdirectorio tengo el módulo
CommonFunction
. A la derecha, mi consola muestra que después de la ejecución desys.path
, puedo ver mi directorio de trabajo.fuente
Elimine el punto e importe absolute_import al comienzo de su archivo
fuente
Simplemente use el nombre de la carpeta principal en la que se encuentra el archivo .py.
fuente