Ik probeer een module vanaf de console uit te voeren. De structuur van mijn directory is als volgt:
Ik probeer de module p_03_using_bisection_search.py
, uit de problem_set_02
directory te draaien met:
$ python3 p_03_using_bisection_search.py
De code in p_03_using_bisection_search.py
is:
__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()
Ik ben een functie aan het importeren die in p_02_paying_debt_off_in_a_year.py
staat, welke code is:
__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()
Ik krijg de volgende foutmelding:
ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package
Ik heb geen idee hoe ik dit probleem kan oplossen. Ik heb geprobeerd een __init__.py
bestand toe te voegen, maar het werkt nog steeds niet.
Ik heb hetzelfde probleem als jij. Ik denk dat het probleem is dat je relatieve import hebt gebruikt in in-package import
. Er is geen __init__.py
in je directory. Dus importeer gewoon zoals Moses hierboven heeft geantwoord.
Het kernprobleem is denk ik wanneer je importeert met een punt:
from .p_02_paying_debt_off_in_a_year import compute_balance_after
Het is gelijkwaardig aan:
uit __main__.p_02_schulden_aflossen_in_een_jaar import compute_balance_after
waarbij __main__
verwijst naar uw huidige module p_03_using_bisection_search.py
.
In het kort, de interpreter kent uw directory architectuur niet.
Als de interpreter in p_03.py
komt, is het script gelijk aan:
from p_03_using_bisection_search.p_02_paying_debt_off_in_a_year import compute_balance_after
en p_03_using_bisection_search
bevat geen modules of instanties met de naam p_02_paying_debt_off_in_a_year
.
Dus kwam ik met een schonere oplossing zonder python omgevingswaarden te veranderen (na het opzoeken van hoe verzoeken doen in relatieve import):
De hoofdarchitectuur van de directory is:
main.py
setup.py
---problem_set_02/
------__init__.py
------p01.py
------p02.py
------p03.py
Schrijf dan in __init__.py
:
from .p_02_paying_debt_off_in_a_year import compute_balance_after
Hier is __main__
__init__
, het verwijst precies naar de module problem_set_02
.
Ga dan naar main.py
:
import problem_set_02
Je kunt ook een setup.py
schrijven om een specifieke module aan de omgeving toe te voegen.
Hallo Volg onderstaande stap, u zult dit probleem oplossen.
Als u een directory en sub-directory heeft aangemaakt, volg dan de onderstaande stappen en houd er rekening mee dat alle directory __init__.py
moeten hebben om het als een directory te laten herkennen.
import sys
en voer sys.path
uit, u zult in staat zijn om alle paden te zien die door python worden gezocht. U moet in staat zijn om uw huidige werkdirectory te zien.Nu importeer subdirectory en de respectievelijke module die u wilt gebruiken met behulp van import volg dit commando: import subdir.subdir.modulename as abc
en nu kun je de methodes in die module gebruiken.
ScreenShotforSameIssue
Zoals je kunt zien in deze screenshot heb ik een bovenliggende directory en twee sub-directories en onder de tweede sub-directories heb ik module==CommonFunction en aan de rechterkant zie je na het uitvoeren van sys.path mijn werkdirectory