2009-10-18 28 views
7

Gần đây tôi đã chuyển dự án Python của mình để chạy trên Python 3.1. Đối với điều đó tôi đã phải áp dụng chính sách nhập khẩu tương đối trong các mô-đun con và các gói con của dự án của tôi. Tôi đã không làm điều đó và bây giờ dự án hoạt động, nhưng tôi nhận thấy rằng tôi không thể thực hiện bất kỳ gói con hoặc submodules nào trong đó. Nếu tôi cố gắng, tôi nhận được "builtins.ValueError: Cố gắng nhập khẩu tương đối không gói". Tôi chỉ có thể nhập toàn bộ dự án.Python: Do nhập khẩu tương đối có nghĩa là bạn không thể thực hiện một gói con của chính nó?

Điều này có bình thường không?

Trả lời

3

Bạn có thể sử dụng -m cờ của trình thông dịch python để chạy các mô-đun trong các gói con (hoặc thậm chí các gói trong 3.1.).

+0

Tôi muốn nói bạn * có * để sử dụng công tắc '-m'; nó không phải là bạn * có thể *. Tôi thích gọi các tập tin python trực tiếp, bởi vì tôi không cần phải nhớ chuyển đổi và vỏ của tôi độc đáo tự động hoàn thành. –

+0

Xem câu trả lời này nếu bạn quan tâm đến việc chạy tập lệnh python thực thi từ một mô-đun con: http://stackoverflow.com/a/11537218/730150 – krumpelstiltskin

4

Vâng, điều đó là bình thường. Nếu bạn muốn thực hiện một mô-đun cũng là một phần của một gói (trong chính nó là một điều kỳ lạ để làm), bạn cần phải có nhập khẩu tuyệt đối. Khi bạn thực thi mô-đun, không phải, từ điểm thông dịch của chế độ xem, một phần của gói, nhưng là mô-đun __main__. Vì vậy, nó sẽ không biết nơi mà các gói tương đối được.

Cách thông thường để làm điều đó là phải có chức năng trong các gói, và các kịch bản thực thi riêng biệt mà gọi chức năng, vì điều này cho phép bạn đặt các kịch bản thực thi bên ngoài module, ví dụ như trong/usr/bin

+1

Wow, tôi tìm thấy triết lý này lạ. Ví dụ, tôi có trong dự án của tôi một gói 'cuộc sống'. Đường dẫn tuyệt đối của nó là 'garlicsim.bundled.simulation_packages.life'. Tôi đã có thể tự mình chạy nó, vì nó không phụ thuộc vào bất cứ thứ gì trong 'garlicsim'. Tại sao tôi không thể tự chạy nó? –

+0

1. Nếu nó không phụ thuộc vào bất cứ điều gì trong garlicsim, thì tại sao nó lại trong tỏisim? 2. Tại sao bạn không thể tự chạy nó? Bạn có thể tự chạy nó, nhưng bạn cần phải nhập khẩu tuyệt đối, đó là 'từ garlicsim.bundled.simulation_packages.life nhập bất cứ thứ gì'. 3. Triết lý mà bạn thấy lạ là gì? Tôi không đề cập đến bất kỳ triết gia nào, vì vậy tôi không biết triết lý "này" là gì. –

+3

1. Nó chỉ đi kèm. Nhưng tôi có thể lấy một ví dụ khác, của 'garlicsim.asynchronous_crunching.crunchers', là một gói phụ mà garlicsim phụ thuộc vào, nhưng nó không phụ thuộc vào garlicsim. (2) Nói rằng nếu tôi muốn chuyển nó sang một gói khác vào một ngày nào đó, tại sao tôi không thể, mà không cần phải chỉnh sửa các dòng nhập? (3) Có lẽ tôi nên nói "chính sách" thay vì "triết học". Thái độ này, khi có thể (a) thực hiện gói độc lập, hoặc (b) chuyển nó sang các gói khác một cách dễ dàng, _but không phải cả hai_. –

-1

Tôi có số same problem và tôi coi chuyển đổi là -m quá khó.

Thay vào đó tôi sử dụng này:

try: 
    from . import bar 
except ValueError: 
    import bar 

if __name__ == "__main__": 
    pass 
+0

Nhập khẩu tương đối ngầm không được dùng nữa và bị loại bỏ trong python 2.7. – habnabit

+0

Arron, bạn nói đúng nhưng tôi không thấy điều này thay đổi giải pháp của tôi như thế nào. Điều này làm việc với bất kỳ python 2.5-3.1. – sorin

+0

không, điều này không hoạt động trong 3.x. Nó bị xóa trong 2.7+, bao gồm 3.0-3.1. – habnabit

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