2011-09-14 26 views
11

Tôi đang phát triển một gói với cấu trúc sau trên đĩa:Làm cách nào để giải quyết xung đột không gian tên trong các gói Python của tôi với tên gói thư viện chuẩn?

foo/ 
    __init__.py 
    xml.py 
    bar.py 
    moo.py 

Gói xml.py cung cấp một lớp học mà một số phân tích cú pháp XML tùy chỉnh và dịch thuật cho các thành phần gói khác sử dụng một cú pháp dòng SAX. Vì vậy, nó có trong nó:

import xml.sax 
import xml.sax.handler 

Nhưng khi tôi đi đến sử dụng trong một ứng dụng tôi nhận được:

Traceback (most recent call last): 
    File "testxmlparser.py", line 15, in <module> 
    import foo.xml 
    File "~/code/foo/xml.py", line 39, in <module> 
    import xml.sax 
ImportError: No module named sax 

tôi dường như có một cuộc xung đột không gian tên. Nếu tôi đổi tên xml.py thành một cái gì đó khác như xmlparser.py mọi thứ hoạt động như mong đợi. Nhưng điều này cảm thấy như là điều sai trái để làm. Tôi cảm thấy như tôi đang thiếu một cái gì đó cơ bản về tên gói và độ phân giải trong Python ở đây.

Có cách nào thích hợp để thực hiện công việc này không liên quan đến việc đổi tên tệp foo/xml.py không? Hay đó thực sự là giải pháp duy nhất cho các tên xung đột?

Chỉnh sửa: "Tránh đặt tên những thứ giống như mô-đun Python tiêu chuẩn" có vẻ ... well..a mineshaft cho tôi. Đó là một mục tiêu di động, bộ mô-đun chuẩn, đó là ràng buộc để thay đổi và phát triển theo thời gian. Vì vậy, trừ khi bạn nhận được thực sự là quảng cáo với tên của bạn, các giải pháp đổi tên-mọi thứ-cho-bạn-tìm-gì-không-xung đột có vẻ kém với tôi. Bên cạnh đó, tôi đã có nó trong một tên gói duy nhất với foo đã (Tôi không sử dụng foo, nhưng cái gì đó chắc chắn là duy nhất), không phải là đủ?

Trả lời

13

Như đã đề cập over here, sử dụng

from __future__ import absolute_import 

và sử dụng relative imports nếu cần thiết.

+0

Vấn đề là 'xml.sax' không nằm trong gói * my *. Vì vậy, một nhập khẩu tương đối của nó không hoạt động. Đó là lý do tại sao nó không cho tôi ngay bây giờ. Python kỳ vọng 'xml.sax' là tương đối so với gói' foo.xml' của tôi, nhưng nó không phải. –

+0

Đó là chính xác những gì tôi đã sau. Cảm ơn! –

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