ModuleNotFoundError: __main__'nin bir paket olmadığı ne anlama geliyor?


208

Konsoldan bir modül çalıştırmaya çalışıyorum. Dizininin yapısı şudur:

resim açıklamasını buraya girin

Ben modülünü çalıştırmak çalışıyorum p_03_using_bisection_search.pygelen problem_set_02kullanılarak dizinde:

$ python3 p_03_using_bisection_search.py

İçindeki kod 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()

p_02_paying_debt_off_in_a_year.pyHangi kod olan bir işlevi ithal ediyorum :

__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 sorunun nasıl çözüleceği hakkında hiçbir fikrim yok. Bir __init__.pydosya eklemeyi denedim , ancak hala çalışmıyor.


3
Sorun değil, ama sadece oraya atmak istedim: eval(input...muhtemelen harika bir fikir değil. Ben sadece rastgele kod yürütme fırsatını açmak yerine ayrıştırmak istiyorum.
17'de Carcigenicate

2
Bu eval(input(...bit 2to3 tarafından önerildi bahis . Bugün bana bunu yapmasını istedim. sevindim takip etmiyorum bu önerileri kör
ckot

Yanıtlar:


238

Göreli içe aktarma için noktayı kaldırın ve şunları yapın:

from p_02_paying_debt_off_in_a_year import compute_balance_after

56
sen çözersin. Eklesem bile göreli içe aktarma neden çalışmıyor __init__.py?
lmiguelvargasf

23
Kabul edilen cevap benim için çalışmıyor. Minimalist bir örnek kurulum ekleyerek cevabı muhtemelen genişletebilir misiniz?
Pranasas

13
__init__.pyPyCharm'ım (2018.2.4) bunu bir "Çözümlenmemiş başvuru" olarak işaretlese ve içe aktarma işlemini otomatik olarak tamamlayamasa da, bu benim için (bir paketin içinde, yani aynı klasörde boş olan) çalışır.
djvg

33
@djvg - PyCharm'ı düzeltmek için kök dizini kaynak kök olarak işaretleyebilirsiniz
Denis Yakovlev

12
Python'un ithalatı ile çalışmak sinir bozucu. Python 3, PyCharm ve MyPy'nin hepsi bizim pahasına büyük bir kahkaha atıyor gibi. O kadar nasıl from ..sibling_pkg.nephew import my_functionpycharm için geçerlidir ancak sonuçlanır ValueError: attempted relative import beyond top-level packageve MyPy Cannot find module named '.sibling_pkg.nephew'(not tek bir "" hatası, iki değil). Ancak, from sibling_pkg.nephew import my_functionamaçlandığı gibi çalışır, MyPy hatası yoktur, ancak PyCharm hatasıyla sonuçlanır.
ubiquibacon

85

Seninle aynı meseleye sahibim. Sorun göreceli ithalat kullandığınız olduğunu düşünüyorum in-package import. Dizininizde yok __init__.py. Öyleyse Musa yukarıda cevapladığı gibi içe aktarın.

Sanırım temel nokta bir nokta ile içe aktardığınızda:

from .p_02_paying_debt_off_in_a_year import compute_balance_after

Şuna eşittir:

from __main__.p_02_paying_debt_off_in_a_year import compute_balance_after

burada __main__mevcut modülünüz anlamına gelir p_03_using_bisection_search.py.


Kısaca, tercüman dizin mimarinizi bilmiyor.

Tercüman içeri girdiğinde, p_03.pykomut dosyası şuna eşittir:

from p_03_using_bisection_search.p_02_paying_debt_off_in_a_year import compute_balance_after

ve p_03_using_bisection_searchadı verilen herhangi bir modül ya da örnek içermez p_02_paying_debt_off_in_a_year.


Bu yüzden python ortamı değerlerini değiştirmeden daha temiz bir çözüm buldum ( göreceli ithalatta isteklerin nasıl yapıldığını araştırdıktan sonra ):

Dizinin ana mimarisi:

main.py

setup.py

---problem_set_02/

------__init__.py

------p01.py

------p02.py

------p03.py

Sonra yazın __init__.py:

from .p_02_paying_debt_off_in_a_year import compute_balance_after

İşte __main__ise __init__tam olarak modüle eder, problem_set_02.

Ardından şu adrese gidin main.py:

import problem_set_02

Ayrıca setup.py, ortama belirli bir modül eklemek için bir de yazabilirsiniz .


9

Aşağıdaki gibi çalıştırmayı deneyin:

python3 -m p_03_using_bisection_search


2

Dizin ve alt dizin oluşturduysanız, aşağıdaki adımları izleyin ve dizinin __init__.pybir dizin olarak tanınması için lütfen tüm dizinin olması gerektiğini unutmayın .

  1. Senaryonuzda, dahil import sysve sys.pathPython için kullanılabilir tüm yolları görebilirsiniz. Geçerli çalışma dizininizi görebilmeniz gerekir.

  2. Şimdi, kullanarak kullanmak istediğiniz alt dizini ve ilgili modülü içe aktarın: import subdir.subdir.modulename as abcve şimdi bu modüldeki yöntemleri kullanabilirsiniz.

resim açıklamasını buraya girin

Örnek olarak, bu ekran görüntüsünde bir üst dizin ve iki alt dizin var ve ikinci alt dizinler altında modül var görebilirsiniz CommonFunction. Sağ tarafta konsolum yürütüldükten sonra sys.pathçalışma dizinimi görebildiğimi gösteriyor.


1

Noktayı kaldırın ve dosyanızın başına absolute_import'u içe aktarın

from __future__ import absolute_import

from p_02_paying_debt_off_in_a_year import compute_balance_after

1

.Py dosyasının bulunduğu ana klasörün adını kullanmanız yeterlidir.

from problem_set_02.p_02_paying_debt_off_in_a_year import compute_balance_after
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.