2017-01-23 2 views
25

Я пытаюсь запустить модуль с консоли. Структура моего каталога заключается в следующем: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' 

""" 
Docstring 
""" 

from .p_02_paying_debt_off_in_a_year import compute_balance_after 


def compute_bounds(balance: float, 
        annual_interest_rate: float) -> (float, float): 
    """" 
    Docstring 
    """ 
    # there is code here, but I have omitted it to save space 
    pass 


def compute_lowest_payment(balance: float, 
          annual_interest_rate: float) -> float: 
    """ 
    Docstring 
    """ 
    # 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' 

""" 
Docstring 
""" 


def compute_balance(balance: float, 
        fixed_payment: float, 
        annual_interest_rate: float) -> float: 
    """ 
    Docstring 
    """ 
    # 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: 
    """ 
    Docstring 
    """ 
    # Omitted code 
    pass 


def compute_fixed_monthly_payment(balance: float, 
            annual_interest_rate: float) -> float: 
    """ 
    Docstring 
    """ 
    # 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, но он все еще не работает.

+0

Не ваша проблема, но я просто хотел ее выбросить: 'eval (input ...' вероятно, не очень хорошая идея. Я просто проанализирую его, а не открою возможность для выполнения произвольного кода. – Carcigenicate

ответ

35

Просто удалите точку для относительного импорта и сделать:

from p_02_paying_debt_off_in_a_year import compute_balance_after 
+4

вы решаете его. Почему относительный импорт не работает, даже если я добавляю '__init __. py'? – lmiguelvargasf

+1

http://stackoverflow.com/a/73149/3125566 –

+3

Принятый ответ не работает для меня.Не могли бы вы расширить ответ, добавив минимальный пример установки? – Pranasas

11

У меня такая же проблема, как вы делали. Я думаю, проблема заключается в том, что вы использовали относительный импорт в 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.

Вкратце, интерпретатор не знает вашу архитектуру вашего каталога.


Так что я пришел с чистым раствором без изменения питона окружения ценности (после глядя, как 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__ is __init__, он точно относится к модулю problem_set_02.

Затем перейдите к main.py:

import problem_set_02

Вы также можете написать setup.py добавить специальный модуль к окружающей среде.

0

Hi Пожалуйста, следуйте ниже, вы разрешите эту проблему. Если вы создали каталог и подкаталог, выполните следующие шаги и, пожалуйста, имейте в виду, что вся директория должна иметь «init .py», чтобы узнать его как каталог.

  1. «импорт SYS» и запустить «sys.path», вы сможете увидеть все пути, который в настоящее время поиск по python.You должен быть в состоянии видеть свой текущий рабочий каталог.

  2. Теперь импортировать подкаталог и соответствующий модуль, который вы хотите использовать с помощью импорта выполните команду: «импорт subdir.subdir.modulename как аЬс», и теперь вы можете использовать методы в этом модуле. ScreenShotforSameIssue

как вы можете видеть на скриншоте у меня есть один родительский каталог и две поддиректории и под второй подкаталогами я есть модуль == CommonFunction и вы видите правую сторону после выполнения sys.path Я могу видеть мой рабочий каталог

+1

Я предложил изменить ваше сообщение, чтобы исправить его –