2017-01-23 15 views
25

Tôi đang cố chạy mô-đun từ bảng điều khiển. Cấu trúc của thư mục của tôi là thế này:ModuleNotFoundError: Có nghĩa là gì __main__ không phải là một gói?

enter image description here

Tôi cố gắng để chạy các mô-đun p_03_using_bisection_search.py, từ thư mục problem_set_02 sử dụng:

$ python3 p_03_using_bisection_search.py 

các mã bên p_03_using_bisection_search.py là:

__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() 

Tôi đang nhập một chức năng nằm ở p_02_paying_debt_off_in_a_year.py mã nào là:

__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() 

Tôi nhận được lỗi sau:

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

Tôi đã không biết làm thế nào để giải quyết vấn đề này. Tôi đã thử thêm một tập tin __init__.py, nhưng nó vẫn không hoạt động.

+0

Không phải vấn đề của bạn, nhưng tôi chỉ muốn ném nó ra: 'eval (input ...' có lẽ không phải là một ý tưởng hay. Tôi chỉ phân tích cú pháp thay vì mở – Carcigenicate

Trả lời

35

Đơn giản chỉ cần loại bỏ các dấu chấm cho việc nhập khẩu tương đối và làm:

from p_02_paying_debt_off_in_a_year import compute_balance_after 
+4

bạn giải quyết nó Tại sao nhập tương đối không hoạt động ngay cả khi tôi thêm '__init __. py'? – lmiguelvargasf

+1

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

+3

Câu trả lời được chấp nhận không hoạt động đối với tôi.Bạn có thể mở rộng câu trả lời bằng cách thêm một thiết lập ví dụ tối giản? – Pranasas

11

Tôi có vấn đề tương tự như bạn đã làm. Tôi nghĩ rằng vấn đề là bạn sử dụng nhập khẩu tương đối trong in-package import. Không có __init__.py trong thư mục của bạn. Vì vậy, chỉ cần nhập khẩu như Moses trả lời ở trên.

Vấn đề cốt lõi tôi nghĩ là khi bạn nhập với một dấu chấm, như:

from .p_02_paying_debt_off_in_a_year import compute_balance_after.

Nó tương đương với:

from __main__.p_02_paying_debt_off_in_a_year import compute_balance_after.

Chúng ta đều biết rằng __main__ là mô-đun hiện tại của bạn p_03_using_bisection_search.py.

Ở đây có vấn đề:

Khi người phiên dịch có được trong p_03.py, kịch bản tương đương với:

from p_03_using_bisection_search.p_02_paying_debt_off_in_a_year import compute_balance_after

Rõ ràng, p_03_using_bisection_search không chứa bất kỳ module hoặc các trường hợp được gọi là p_02_paying_debt_off_in_a_year.

Tóm tắt, thông dịch viên không biết kiến ​​trúc thư mục của bạn.


Vì vậy, tôi đã đưa ra một giải pháp sạch hơn mà không thay đổi có giá trị môi trường python (sau khi nhìn lên như thế nào requests làm trong nhập khẩu tương đối):

Kiến trúc chính của thư mục là:

main.py

setup.py

--- problem_set_02/

------ __init__.py

------ p01.py

------ p02.py

------ p03.py

Sau đó, viết bằng __init__.py:

from .p_02_paying_debt_off_in_a_year import compute_balance_after 

Ở đây __main____init__, nó chính xác đề cập đến mô-đun problem_set_02.

Sau đó đi đến main.py:

import problem_set_02

Bạn cũng có thể viết một setup.py để thêm module cụ thể đối với môi trường.

0

Xin vui lòng làm theo bước dưới đây, bạn sẽ giải quyết vấn đề này. Nếu bạn đã tạo thư mục và thư mục con, hãy làm theo các bước dưới đây và xin lưu ý rằng tất cả thư mục phải có "init .py" để thư mục đó được nhận dạng là một thư mục.

  1. "nhập sys" và chạy "sys.path", bạn sẽ có thể xem tất cả đường dẫn đang được tìm kiếm bởi python.Bạn phải có thể xem thư mục làm việc hiện tại của mình.

  2. Bây giờ nhập thư mục con và mô-đun tương ứng mà bạn muốn sử dụng bằng cách nhập theo lệnh này: "nhập subdir.subdir.modulename dưới dạng abc" và bây giờ bạn có thể sử dụng các phương pháp trong mô-đun đó. ScreenShotforSameIssue

như bạn có thể nhìn thấy trong ảnh chụp màn hình này, tôi có một thư mục cha và hai thư mục con và dưới thứ hai thư mục con tôi có mô-đun == CommonFunction và bạn thấy bên phải sau khi thực hiện sys.path Tôi có thể thấy thư mục làm việc của tôi

+1

Tôi đã đề xuất chỉnh sửa cho bài đăng của bạn để khắc phục sự cố –