Tôi đang cố gắng thiết lập một số import hooks qua sys.meta_path
, theo cách tương tự tương tự như this SO question. Đối với điều này, tôi cần phải xác định hai chức năng find_module
và load_module
như được giải thích trong liên kết ở trên. Dưới đây là load_module
chức năng của tôi,Móc nhập khẩu cho PyQt4.QtCore
import imp
def load_module(name, path):
fp, pathname, description = imp.find_module(name, path)
try:
module = imp.load_module(name, fp, pathname, description)
finally:
if fp:
fp.close()
return module
mà hoạt động tốt cho hầu hết các mô-đun, nhưng không cho PyQt4.QtCore
khi sử dụng Python 2.7:
name = "QtCore"
path = ['/usr/lib64/python2.7/site-packages/PyQt4']
mod = load_module(name, path)
trả về,
Traceback (most recent call last):
File "test.py", line 19, in <module>
mod = load_module(name, path)
File "test.py", line 13, in load_module
module = imp.load_module(name, fp, pathname, description)
SystemError: dynamic module not initialized properly
Các tác phẩm cùng mã tốt với Python 3.4 (mặc dù imp
không được dùng nữa và thay vào đó, importlib
nên được sử dụng lý tưởng).
Tôi cho rằng điều này có liên quan đến việc khởi tạo mô-đun động SIP. Có điều gì khác tôi nên thử với Python 2.7?
Lưu ý: điều này áp dụng cả với PyQt4
và PyQt5
.
Sửa: đây có thể liên quan đến this question như thật vậy,
cd /usr/lib64/python2.7/site-packages/PyQt4
python2 -c 'import QtCore'
thất bại với lỗi tương tự. Tuy nhiên tôi không chắc chắn những gì sẽ là một con đường xung quanh nó ...
Edit2: sau yêu cầu @Nikita 's cho một trường hợp sử dụng cụ thể ví dụ, những gì tôi đang cố gắng làm là để chuyển hướng nhập khẩu , vì vậy khi có import A
, điều gì sẽ xảy ra là import B
. Người ta thực sự có thể nghĩ rằng đối với điều này nó sẽ là đủ để làm đổi tên mô-đun trong find_spec/find_module
và sau đó sử dụng mặc định load_module
. Tuy nhiên, không rõ nơi để tìm một thực hiện mặc định load_module
trong Python 2. Việc thực hiện gần nhất tôi đã tìm thấy một cái gì đó tương tự là future.standard_library.RenameImport
. Có vẻ như không có cổng sau của việc triển khai hoàn chỉnh importlib
từ Python 3 đến 2.
Ví dụ làm việc tối thiểu cho móc nhập tái tạo vấn đề này có thể được tìm thấy trong số gist này.
Nếu nó có thể hữu ích, để cung cấp cho một số bối cảnh chung của những gì tôi đang cố gắng để làm, thấy gói [SiQt] (https://github.com/rth/SiQt), và vấn đề này là đã thảo luận trong [vấn đề github này] (https://github.com/rth/SiQt/issues/4). – rth
tôi thực sự không hiểu vấn đề của bạn nhưng có gì sai với '__import __ ('PyQt4.QtCore')'. nó có dẫn tới đệ quy vô hạn? – danidee
@danidee Không có gì sai với '__import __ ('A')', nhưng nó tương đương với việc sử dụng 'import A'. Những gì tôi muốn là thay đổi những gì xảy ra khi bạn làm điều đó, và đặc biệt chạy 'import B', khi bạn' import A'. Điều này có thể được thực hiện với các móc nhập khẩu trong 'sys.meta_path', nhưng chúng đòi hỏi các hàm mức thấp hơn như' imp.load_module'. – rth