Jeg prøver å kjøre en modul fra konsollen. Strukturen i katalogen min er slik:
Jeg prøver å kjøre modulen p_03_using_bisection_search.py
, fra katalogen problem_set_02
ved å bruke:
$ python3 p_03_using_bisection_search.py
Koden i p_03_using_bisection_search.py
er:
__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()
Jeg importerer en funksjon som finnes i p_02_paying_debt_off_in_a_year.py
, og koden er:
__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()
Jeg får følgende feil:
ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package
Jeg aner ikke hvordan jeg skal løse dette problemet. Jeg har prøvd å legge til en __init__.py
-fil, men det fungerer fortsatt ikke.
Jeg har det samme problemet som deg. Jeg tror problemet er at du brukte relativ import i in-package import
. Det er ingen __init__.py
i katalogen din. Så bare importer som Moses svarte ovenfor.
Kjerneproblemet tror jeg er når du importerer med en prikk:
from .p_02_paying_debt_off_in_a_year import compute_balance_after
Det tilsvarer:
from __main__.p_02_paying_debt_off_in_a_year import compute_balance_after
hvor __main__
refererer til din nåværende modul p_03_using_bisection_search.py
.
**Kort sagt, tolken kjenner ikke til katalogarkitekturen din.
Når tolken kommer inn i p_03.py
, blir skriptet lik:
from p_03_using_bisection_search.p_02_paying_debt_off_in_a_year import compute_balance_after
og p_03_using_bisection_search
inneholder ingen moduler eller instanser som heter p_02_paying_debt_off_in_a_year
.
Så jeg kom opp med en renere løsning uten å endre python-miljøverdier (etter å ha slått opp hvordan forespørsler gjør i relativ import):
Hovedarkitekturen til katalogen er:
main.py
.
setup.py
---`problem_set_02/
------__init__.py
------p01.py
------p02.py
------p03.py
Skriv deretter inn __init__.py
:
from .p_02_paying_debt_off_in_a_year import compute_balance_after
Her er __main__
__init__
, den refererer nøyaktig til modulen problem_set_02
.
Gå deretter til main.py
:
import problem_set_02
.
Du kan også skrive en setup.py
for å legge til en spesifikk modul i miljøet.
Hei Vennligst følg trinnene nedenfor, du vil løse dette problemet.
Hvis du har opprettet katalog og underkatalog, følg trinnene nedenfor, og husk at alle kataloger må ha __init__.py
for å bli gjenkjent som en katalog.
import sys
og kjør sys.path
, vil du kunne se alle stier som python søker i. Du må kunne se din nåværende arbeidskatalog.
Nå importerer du underkatalogen og den respektive modulen du vil bruke ved hjelp av import ved å følge denne kommandoen: import subdir.subdir.modulename as abc
og nå kan du bruke metodene i den modulen.
Skjermbilde for samme utgave.
som du kan se i dette skjermbildet, har jeg en overordnet katalog og to underkataloger, og under den andre underkatalogen har jeg module==CommonFunction. og du ser på høyre side etter kjøring av sys.path kan jeg se arbeidskatalogen min