コンソールからモジュールを実行しようとしています。私のディレクトリの構造は次のようになっています。
私は、モジュール 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 __name__ == '__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 __name__ == '__main__':
main()
以下のようなエラーが発生します。
ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package
この問題を解決する方法がわかりません。init.py`ファイルを追加してみましたが、まだうまくいきません。
私もあなたと同じ問題を抱えています。問題は、in-package import
で相対的なimportを使用したことだと思います。あなたのディレクトリには __init__.py
はありません。ですから、Mosesが上で答えたようにインポートしてください。
私が考える核心的な問題は、ドットでインポートする場合です。
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の環境変数を変更することなく、よりすっきりとした解決策を考えました(requestsが相対インポートでどのようにしているかを調べました)。
このディレクトリのメインのアーキテクチャは
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
を書くこともできます。
この問題を解決するには、以下の手順を実行してください。
ディレクトリとサブディレクトリを作成している場合は、以下の手順に従ってください。また、すべてのディレクトリには、ディレクトリとして認識されるために、__init__.py
が必要であることを覚えておいてください。
1.1. sysをimportしてsys.pathを実行すると、pythonが検索しているすべてのパスを見ることができます。
2.2. 次のようにして、サブディレクトリと使用したいモジュールを import します。import subdir.subdir.modulename as abc` とすると、そのモジュールのメソッドが使えるようになります。 同号のスクリーンショット.
このスクリーンショットでわかるように、1つの親ディレクトリと2つのサブディレクトリがあり、2つ目のサブディレクトリの下にmodule==CommonFunctionがあります。 そして、sys.pathを実行した後の右側に、私の作業ディレクトリが表示されています。