2015-12-25 28 views
23

Tôi mới sử dụng Python và tôi đang cố gắng hiểu một vấn đề mà tôi thấy khi tạo gói. tôi có cấu trúc tập tin sau đây: (Working-Directory là/my/Python/jmLib2)python3: ImportError: Không có mô đun nào có tên xxxx

/my/Python/jmLib2 
    |--- Phone 
    |  |--- __init__.py 
    |  |--- Pots.py 
    |- Test2.py 

--------------------------------- 
cat ./jmLib2/Pots.py 
#!/usr/bin/python 

def Pots(): 
    print ("I'm Pots Phone") 

--------------------------------- 
cat ./jmLib2/__init__.py 
from Pots import Pots 

--------------------------------- 
cat ./Test2.py 
#!/usr/bin/python 
from Phone import Pots 

import os.path 
print ("OS:"+str(os.path)) 

Pots() 

Khi tôi bây giờ làm:

python2 Test2.py 
OS:<module 'posixpath' from '/usr/lib/python2.7/posixpath.pyc'> 
    I'm Pots Phone* 

tuyệt vời ... nhưng, nếu tôi do:

python3 Test2.py 
Traceback (most recent call last): 
    File "Test2.py", line 2, in <module> 
    from Phone import Pots 
    File "/home/juergen/my/Python/jmLib2/Phone/__init__.py", line 1, in <module> 
    from Pots import Pots 
ImportError: No module named 'Pots' 

Tôi đang làm việc với PyDev trong Eclipse. PyDev báo cáo cho tôi bên trong init .py tệp là "Nhập không được giải quyết: Chậu" -error. Tôi có cùng một vấn đề truy nguyên theo PyDev và bash.

Một lần nữa, tôi mới dùng Python ... vì vậy nó có thể là một sai lầm rất ngu ngốc. Nhưng ai đó có thể giải thích cho tôi, sự khác biệt giữa python2 và python3.4? Tôi có phải sửa đổi PYTHONPATH không? Tại sao?

Greetings Juergen

Trả lời

33

TL; DR:Relative imports are gone. Sử dụng nhập khẩu tuyệt đối để thay thế.

Hoặc sử dụng:

from Phone.Pots import Pots 

hay:

from .Pots import Pots 

Vấn đề xảy ra vì Pots là một phần của gói Phone: không có mô-đun tên Pots, có một mô-đun tên Phone.Pots .

Python 2 có tính năng được gọi là relative imports cho phép bạn viết import Pots ngay cả khi điều đó không đúng về mặt kỹ thuật. Tuy nhiên

nhập khẩu

tương đối là một nguồn problems and confusion:

  • Ai đọc mã không thể ngay lập tức nói liệu nhập khẩu là từ một gói phần mềm hay không.
  • Cách đặt tên mô-đun là Phone.Pots, nhưng tôi có thể sử dụng import Pots? Điều này là rất không nhất quán.
  • Điều gì sẽ xảy ra nếu môđun con xuất hiện tên của mô-đun khác?

Đối với những lý do này, nhập khẩu liên quan đã được gỡ bỏ từ Python 3.


Bạn có thể thoát khỏi hàng nhập khẩu tương đối từ Python 2 bằng cách sử dụng một __future__ import:

from __future__ import absolute_import 
+0

Andrea: Thankyou cho câu trả lời nhanh và chi tiết. – MatrixClient

Các vấn đề liên quan