web-dev-qa-db-ja.com

ModuleNotFoundError:__main__がパッケージではないということはどういう意味ですか?

コンソールからモジュールを実行しようとしています。私のディレクトリの構造はこれです:

enter image description here

p_03_using_bisection_search.pyディレクトリから、モジュールproblem_set_02を実行しようとしています。

$ python3 p_03_using_bisection_search.py

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 __== '__main__':
    main()

私はp_02_paying_debt_off_in_a_year.pyにある関数をインポートしています。

__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 __== '__main__':
    main()

次のようなエラーが表示されます。

ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package

この問題を解決する方法がわかりません。 __init__.pyファイルを追加しようとしましたが、まだ機能していません。

104
lmiguelvargasf

相対インポートのドットを削除して、次のようにします。

from p_02_paying_debt_off_in_a_year import compute_balance_after
132
Moses Koledoye

私はあなたと同じ問題を抱えています。私は問題はあなたがin-package importで相対インポートを使ったことだと思います。ディレクトリに__init__.pyがありません。モーセが上記のようにインポートしてください。

私が思うに中心的な問題は、あなたがドットでインポートするときです。

from .p_02_paying_debt_off_in_a_year import compute_balance_after

これは以下と同等です。

from __main__.p_02_paying_debt_off_in_a_year import compute_balance_after

__main__があなたの現在のモジュールp_03_using_bisection_search.pyを参照していることを私たちは皆知っています。

これが問題です:

インタプリタがp_03.pyに入ると、スクリプトは次のようになります。

from p_03_using_bisection_search.p_02_paying_debt_off_in_a_year import compute_balance_after

どうやらp_03_using_bisection_searchにはp_02_paying_debt_off_in_a_yearという名前のモジュールやインスタンスは含まれていません。

簡単に言うと、インタプリタはあなたのディレクトリアーキテクチャを知りません。


だから私は(相対インポートで 要求 どうするかを調べた後に)Python環境の貴重品を変えずに、よりきれいな解決策を思いついた。

ディレクトリの主なアーキテクチャは次のとおりです。

main.py

setup.py

---problem_set_02/

------__init__.py

------p01.py

------p02.py

------p03.py

それから__init__.pyを書いてください:

from .p_02_paying_debt_off_in_a_year import compute_balance_after

ここで__main____init__です、それは正確にモジュールproblem_set_02を参照します。

それからmain.pyに行きます:

import problem_set_02

特定のモジュールを環境に追加するためにsetup.pyを書くこともできます。

53
hcnhcn012

こんにちはステップの下に従ってください、あなたはこの問題を解決します。ディレクトリとサブディレクトリを作成した場合は、以下の手順に従ってください。ディレクトリとして認識させるには、すべてのディレクトリに " init 。py"が必要です。

  1. 「import sys」を実行して「sys.path」を実行すると、pythonで検索されているすべてのパスを確認できます。現在の作業ディレクトリを確認できるはずです。

  2. インポートを使用したいサブディレクトリとそれぞれのモジュールをインポートします。 " import subdir.subdir.modulename as abc "と入力すると、そのモジュールのメソッドを使用できます。 スクリーンショットの同名作品

このスクリーンショットでわかるように、1つの親ディレクトリと2つのサブディレクトリがあり、2番目のサブディレクトリの下にはmodule == CommonFunctionがあり、sys.pathの実行後に右側に表示されます。

3
Gaurav Singh

次のように実行してみてください。

python3 -m p_03_using_bisection_search

2
Dan Keder