Sto cercando di eseguire un modulo dalla console. La struttura della mia directory è questa:
Sto cercando di eseguire il modulo p_03_using_bisection_search.py
, dalla directory problem_set_02
usando:
$ python3 p_03_using_bisection_search.py
Il codice all'interno di p_03_using_bisection_search.py
è:
__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()
Sto importando una funzione che si trova in p_02_paying_debt_off_in_a_year.py
il cui codice è:
__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()
Sto ottenendo il seguente errore:
ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package
Non ho idea di come risolvere questo problema. Ho provato ad aggiungere un file __init__.py
, ma ancora non funziona.
Ho il tuo stesso problema. Penso che il problema sia che hai usato l'importazione relativa in in-package import
. Non c'è nessun __init__.py
nella tua directory. Quindi importa solo come Moses ha risposto sopra.
Il problema principale penso sia quando importi con un punto:
from .p_02_paying_debt_off_in_a_year import compute_balance_after
È equivalente a:
from __main__.p_02_paying_debt_off_in_a_year import compute_balance_after
dove __main__
si riferisce al vostro modulo corrente p_03_utilizzando_bisection_search.py
.
**In breve, l'interprete non conosce la vostra architettura di directory.
Quando l'interprete entra in p_03.py
, lo script è uguale:
from p_03_using_bisection_search.p_02_paying_debt_off_in_a_year import compute_balance_after
e p_03_using_bisection_search
non contiene alcun modulo o istanza chiamata p_02_paying_debt_off_in_a_year
.
Così ho trovato una soluzione più pulita senza cambiare i valori dell'ambiente python (dopo aver cercato come fanno le richieste in importazione relativa):
L'architettura principale della directory è:
main.py
.
setup.py
.
---problema_set_02/
------__init__.py
------p01.py
------p02.py
------p03.py
Poi scrivere in __init__.py
:
da .p_02_paying_debt_off_in_a_year import compute_balance_after
Qui __main__
è __init__
, si riferisce esattamente al modulo problem_set_02
.
Poi vai a main.py
:
import problem_set_02
.
Puoi anche scrivere un setup.py
per aggiungere un modulo specifico all'ambiente.
Ciao Per favore segui il seguente passo, risolverai questo problema.
Se hai creato una directory e una sotto-directory, allora segui i passi seguenti e tieni a mente che tutte le directory devono avere __init__.py
per essere riconosciute come directory.
importare sys
ed eseguire sys.path
, sarete in grado di vedere tutti i percorsi che vengono ricercati da python.Ora importate la sottodirectory e il rispettivo modulo che volete usare usando import seguendo questo comando: import subdir.subdir.modulename as abc
e ora potete usare i metodi in quel modulo.
ScreenShotforSameIssue
come potete vedere in questo screenshot ho una directory madre e due sotto-directory e sotto la seconda sotto-directory ho module==CommonFunction e vedete a destra dopo l'esecuzione di sys.path posso vedere la mia directory di lavoro