2011-02-04 17 views
5

tôi làm một số công cụ init khi một module được nạp đầu tiên. Vấn đề là bằng cách nào đó nó được nhập khẩu hai lần, và tôi không thể hiểu tại sao. Tôi nghĩ rằng nó có thể được nhập khẩu bằng con đường khác nhau, như trong ví dụ này:Mô-đun nhập khẩu nhiều lần

a.py:

from apps.blog import models 
... 

b.py:

from blog import models 
... 

tôi chèn print __name__ trong mô-đun của tôi, và nó in ra blog.models hai lần, do đó, nó chỉ ra rằng vấn đề không nằm trong đường dẫn nhập.
Vì vậy, là có bất kỳ lý do nào khác cho một module để được nhập khẩu nhiều lần?

UPDATE: tôi không đề cập đến mà tôi đang sử dụng django. Tôi nghĩ rằng vấn đề này liên quan đến kịch bản django's manage.py: https://docs.djangoproject.com/en/dev/releases/1.4/#updated-default-project-layout-and-manage-py

+0

Đối với bất kỳ ai khác có thể có lỗi này, tôi thấy tôi đã gây ra bằng cách cố gắng nhập từ thư mục cha mẹ, không sử dụng ' ..' nhưng bằng cách sử dụng 'sys.path.append (os.path.abspath (os.path.join (os.path.dirname (__ file__), os.path.pardir)))' – Aesthete

Trả lời

8

Thông thường Python không nên nhập mô-đun hai lần bất kể tham chiếu tuyệt đối/tương đối. Có khả năng Python đang xem tệp nguồn dưới dạng hai tệp khác nhau và do đó, nhập chúng một cách riêng biệt. Điều này có thể xảy ra do các tệp/thư mục được liên kết với nhau hoặc các phiên bản khác nhau, hoặc các thư mục chồng chéo trong PYTHONPATH, thật khó để nói.

Một cách để theo dõi này xuống là sử dụng trình gỡ lỗi tương tác. Thêm một dòng import pdb; pdb.set_trace() ở cấp cao nhất của tập tin của bạn, và trong vỏ tương tác nhập bt để có được một vết lùi mà sẽ hiển thị chuỗi nhập khẩu. Tiếp tục với c. Khi tệp được nhập lần thứ hai và trình gỡ lỗi được kích hoạt, hãy thử lại bt và so sánh hai kết quả đầu ra, có thể tiết lộ sự cố.

+4

Một thủ tục dễ dàng hơn là chỉ mô phỏng lỗi trong quá trình nhập (lỗi cú pháp hoặc bất kỳ ngoại lệ nào trong thời gian nhập), điều này sẽ khiến Python in một lần truy nguyên. –

+0

Vui lòng đăng câu trả lời đó dưới dạng câu trả lời riêng để chúng tôi có thể cập nhật đúng cách. –

+0

ngoại lệ vào thời điểm nhập khẩu sẽ cho tôi traceback chỉ việc nhập khẩu đầu tiên –

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