Tôi đang làm việc trên pypreprocessor là một bộ tiền xử lý có chỉ thị kiểu c và tôi có thể làm cho nó hoạt động giống như một bộ tiền xử lý truyền thống (nó tự tiêu tốn và thực thi mã được xử lý trực tiếp) ngoại trừ nó ngắt thư viện nhập khẩu.Làm cách nào để ghi đè nhập bằng Python?
Vấn đề là: Bộ tiền xử lý chạy qua tệp, xử lý nó, xuất ra tệp tạm thời và exec() tệp tạm thời. Thư viện được nhập khẩu cần phải được xử lý một chút khác nhau, bởi vì chúng không được thực hiện, mà là chúng được nạp và có thể truy cập được vào mô-đun người gọi.
Điều tôi cần làm là: Ngắt nhập (do bộ xử lý trước đang được chạy ở giữa quá trình nhập), tải mã đã xử lý dưới dạng tempModule và thay thế nhập ban đầu bằng tempModule để lừa kịch bản lệnh gọi với việc nhập khẩu tin rằng tempModule là mô-đun ban đầu.
Tôi đã tìm kiếm ở khắp mọi nơi và cho đến nay và không có giải pháp.
này Stack Overflow câu hỏi là gần nhất tôi đã nhìn thấy cho đến nay để cung cấp một câu trả lời: Override namespace in Python
Đây là những gì tôi có.
# Remove the bytecode file created by the first import
os.remove(moduleName + '.pyc')
# Remove the first import
del sys.modules[moduleName]
# Import the postprocessed module
tmpModule = __import__(tmpModuleName)
# Set first module's reference to point to the preprocessed module
sys.modules[moduleName] = tmpModule
moduleName là tên của mô-đun gốc và tmpModuleName là tên của tệp mã hậu xử lý.
Phần lạ là giải pháp này vẫn chạy hoàn toàn bình thường như thể mô-đun đầu tiên hoàn thành được tải bình thường; trừ khi bạn loại bỏ dòng cuối cùng, sau đó bạn nhận được một lỗi không tìm thấy mô-đun.
Hy vọng rằng ai đó trên Stack Luồng tràn biết nhiều hơn về nhập khẩu hơn tôi, bởi vì điều này khiến tôi bối rối.
Lưu ý: Tôi sẽ chỉ trao giải pháp, hoặc, nếu điều này không thể thực hiện được bằng Python; giải thích tốt nhất, chi tiết nhất về lý do tại sao điều này không phải là không thể.
Cập nhật: Đối với bất kỳ ai quan tâm, đây là mã làm việc.
if imp.lock_held() is True:
del sys.modules[moduleName]
sys.modules[tmpModuleName] = __import__(tmpModuleName)
sys.modules[moduleName] = __import__(tmpModuleName)
phần 'imp.lock_held' phát hiện xem mô-đun có đang được tải dưới dạng thư viện hay không. Các dòng sau làm phần còn lại.
Bạn đang viết một bộ xử lý trước, bạn nên phân tích cú pháp các tệp trước khi biên dịch chúng. I E. bạn sẽ có thể thay đổi 'import module' thành' import post_processed_module' trước khi thời gian python tải tệp của bạn, bằng cách phân tích cú pháp nguồn, sửa đổi nó và đặt nó vào một tệp. Sau khi bạn đã xử lý xong tất cả cây nguồn _then_, bạn có thể thực thi() tệp gốc đã xử lý sau. – Iacopo
@lacopo Thật không may, bộ tiền xử lý cần được nhập vào tệp mà nó đang xử lý trước. Đó là một loại, nhập khẩu các tiền xử lý và tiền xử lý chỉ thị sẽ làm việc trong tập tin này. I E. nó tự tiêu tốn. –