Konsoldan bir modül çalıştırmaya çalışıyorum. Dizinimin yapısı şu şekildedir:
kullanarak problem_set_02
dizininden p_03_using_bisection_search.py
modülünü çalıştırmaya çalışıyorum:
$ python3 p_03_using_bisection_search.py
p_03_using_bisection_search.py`nin içindeki kod:
__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()
Kodu p_02_paying_debt_off_in_a_year.py
olan bir işlevi içe aktarıyorum:
__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()
Aşağıdaki hatayı alıyorum:
ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package
Bu sorunu nasıl çözeceğime dair hiçbir fikrim yok. Bir __init__.py
dosyası eklemeyi denedim, ancak hala çalışmıyor.
Ben de seninle aynı sorunu yaşıyorum. Sanırım sorun in-package import
içinde relative import kullanmanızdan kaynaklanıyor. Sizin dizininizde __init__.py
dosyası yok. Bu yüzden sadece Moses'ın yukarıda cevapladığı gibi içe aktarın.
Bence asıl sorun nokta ile içe aktardığınızda ortaya çıkıyor:
from .p_02_paying_debt_off_in_a_year import compute_balance_after
Buna eşdeğerdir:
from __main__.p_02_paying_debt_off_in_a_year import compute_balance_after
burada __main__
geçerli modülünüz olan p_03_using_bisection_search.py
yi ifade eder.
Kısaca, yorumlayıcı dizin mimarinizi bilmiyor.
Yorumlayıcı p_03.py
dosyasına girdiğinde, komut dosyası eşitlenir:
from p_03_using_bisection_search.p_02_paying_debt_off_in_a_year import compute_balance_after
ve p_03_using_bisection_search
, p_02_paying_debt_off_in_a_year
adında herhangi bir modül veya örnek içermez.
Bu yüzden python ortam değerlerini değiştirmeden daha temiz bir çözüm buldum (requests'in göreceli içe aktarmada nasıl yapıldığına baktıktan sonra):
Dizinin ana mimarisi şöyledir:
main.py
setup.py
---problem_set_02/
------__init__.py
------p01.py
------p02.py
------p03.py
Sonra __init__.py
içine yazın:
from .p_02_paying_debt_off_in_a_year import compute_balance_after
Burada __main__
, __init__
dir, tam olarak problem_set_02
modülüne atıfta bulunur.
Sonra main.py
dosyasına gidin:
import problem_set_02
Ayrıca ortama belirli bir modül eklemek için bir setup.py
yazabilirsiniz.
Merhaba Lütfen aşağıdaki adımı izleyin, bu sorunu çözeceksiniz.
Dizin ve alt dizin oluşturduysanız, aşağıdaki adımları izleyin ve lütfen tüm dizinlerin bir dizin olarak tanınması için __init__.py
olması gerektiğini unutmayın.
sysi içe aktarın ve
sys.path`i çalıştırın, python tarafından aranan tüm yolları görebileceksiniz. mevcut çalışma dizininizi görebilmelisiniz.
Şimdi import komutunu kullanarak kullanmak istediğiniz alt dizini ve ilgili modülü içe aktarın: import subdir.subdir.modulename as abc
ve şimdi bu modüldeki yöntemleri kullanabilirsiniz.
ScreenShotforSameIssue
Bu ekran görüntüsünde görebileceğiniz gibi bir ana dizinim ve iki alt dizinim var ve ikinci alt dizinlerin altında modül==CommonFunction var ve sys.path komutunu çalıştırdıktan sonra sağ tarafta çalışma dizinimi görebiliyorum