Sửa: như OP giờ đây đã nói rằng vấn đề này là một trong nhập khẩu tương đối được ưa thích đến tuyệt đối, giải pháp đơn giản cho vấn đề cụ thể của OP là thêm vào lúc bắt đầu của các mô-đun from __future__ import absolute_import
làm thay đổi điều đó "sở thích "/ đặt hàng.
Sau đây vẫn áp dụng đối với các vấn đề tế nhị của hai đụng độ nhập khẩu tuyệt đối (mà không xuất hiện để được gì OP hiện đang phải đối mặt với ...):
Khi bạn đã nhập khẩu một module có tên x
, mô-đun đó được ghi lại trong sys.modules['x']
- thay đổi sys.path khi bạn đang thực hiện sẽ không thay đổi sys.modules. Bạn cũng sẽ cần thay đổi trực tiếp sys.modules.
Ví dụ: xem xét:
$ cat a/foo.py
print __file__; import sys; sys.path.insert(0, "b"); del sys.modules["foo"]; import foo
$ cat b/foo.py
print __file__
$ python2.5 -c'import sys; sys.path.insert(0, "a"); import foo'
a/foo.py
b/foo.py
(chạy lại sẽ sử dụng và hiển thị các tập tin pyc thay vì những cái py tất nhiên).
Không phải cách tiếp cận rõ ràng nhất, và dĩ nhiên, không thể truy cập từ mô-đun foo ban đầu nữa (vì mục nhập sys.modules của nó đã bị di dời), nhưng bạn có thể chơi các thủ thuật mong manh hơn nếu cần (stash sys.modules["foo"]
một nơi nào đó trước khi xóa nó, sau khi bạn nhập khẩu khác foo đặt mô-đun đó ở một nơi khác và phục hồi bản gốc sys.modules["foo"]
- vv, vv), tùy thuộc vào nhu cầu chính xác của bạn. (Tất nhiên, tránh các cuộc đụng độ tên ở nơi đầu tiên sẽ gần như luôn luôn đơn giản hơn waltzing tất cả xung quanh chúng theo cách này ;-).
Nguồn
2009-12-04 18:18:09
Điều thú vị, tôi nhận được kết quả ngược lại một thời gian ngắn trước khi thực hiện nhập từ {something {something} {something} ' – MitMaro
Tôi không hoàn toàn rõ ràng về những gì bạn đang cố gắng làm. Liệu nó có phải là 'bóng' mô-đun 'sqlalchemy' thực sự với mô-đun của riêng bạn, để các mô-đun khác cố gắng nhập 'sqlalchemy' thay vào đó, nhưng (chỉ) bạn mới có thể nhận được' sqlalchemy' thực sự? –
Không, đó là mô-đun con của gói lớn hơn. Nó chỉ xảy ra như vậy mà Python dường như chọn nhập khẩu tương đối trước khi nhập khẩu tuyệt đối. –