2009-08-10 23 views
205

Tôi biết nó có thể được thực hiện, nhưng tôi không bao giờ nhớ làm thế nào.Reimport một mô-đun trong python trong khi tương tác

Làm cách nào bạn có thể nhập lại mô-đun trong python? Kịch bản như sau: Tôi nhập một mô-đun tương tác và tinker với nó, nhưng sau đó tôi phải đối mặt với một lỗi. Tôi sửa chữa lỗi trong tập tin .py và sau đó tôi muốn reimport module cố định mà không bỏ python. Tôi làm nó như thế nào ?

+1

Bản sao có thể có của [Làm cách nào để tải (tải lại) mô-đun Python?] (Http://stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module) – Walter

+0

[ reimport python module] (https://stackoverflow.com/a/437591/6521116) –

Trả lời

204

này nên làm việc:

reload(my.module) 

Từ Python docs

Nạp lại một mô-đun nhập khẩu trước đó. Đối số phải là một đối tượng mô-đun, vì vậy nó phải được nhập thành công trước đó. Điều này rất hữu ích nếu bạn đã chỉnh sửa tệp nguồn mô-đun bằng trình soạn thảo bên ngoài và muốn thử phiên bản mới mà không cần rời khỏi trình thông dịch Python.

+48

** Đừng quên sử dụng phương pháp này **: Khi module được tải lại, từ điển của nó (chứa các biến toàn cục của module) **bị cản trở** . Định nghĩa lại tên sẽ ghi đè các định nghĩa cũ, vì vậy đây thường không phải là vấn đề. Nếu phiên bản mới của mô-đun không xác định tên được xác định bởi phiên bản cũ, thì định nghĩa cũ vẫn còn. – nosklo

+46

** Đừng quên cảnh báo sử dụng phương pháp này **: Nếu một mô-đun nhập khẩu các đối tượng từ một mô-đun khác bằng cách sử dụng 'from ... import ...', gọi 'reload()' cho mô-đun kia ** không xác định lại các đối tượng được nhập từ nó ** - một cách xung quanh việc này là thực hiện lại câu lệnh 'from', một cách khác là sử dụng' import' và tên đủ điều kiện ('module. * name *'). – nosklo

+41

** Đừng quên cảnh báo sử dụng phương pháp này **: Nếu mô-đun instantiates trường hợp của một lớp, tải lại mô-đun xác định lớp ** không ảnh hưởng đến định nghĩa phương thức của các cá thể ** - chúng ** tiếp tục để sử dụng định nghĩa lớp * cũ * **. Điều này cũng đúng đối với các lớp dẫn xuất. – nosklo

138

Trong python 3, reload không còn được tích hợp chức năng nữa.

Nếu bạn đang sử dụng python 3.4 trở lên, bạn nên sử dụng reload từ importlib thư viện thay vì:

import importlib 
importlib.reload(some_module) 

Nếu bạn đang sử dụng python 3.2 hoặc 3.3, bạn nên:

import imp 
imp.reload(module) 

để thay thế. Xem http://docs.python.org/3.0/library/imp.html#imp.reload

Nếu bạn đang sử dụng ipython, chắc chắn xem xét sử dụng phần mở rộng autoreload:

%load_ext autoreload 
%autoreload 2 
+0

Mặc dù nhiều mã Python được viết bằng Python 2, Python 3 đang trở nên khả thi hơn một tùy chọn mỗi ngày. Cảm ơn vì tiền hỗ trợ! –

+32

'imp.reload' không được dùng nữa kể từ Python 3.4, thay vào đó hãy sử dụng hàm [' importlib.reload'] (http://docs.python.org/3.4/library/importlib.html#importlib.reload). – jfs

41

Trên thực tế, trong Python 3 module imp được đánh dấu là NỮA. Vâng, ít nhất đó là sự thật cho 3,4.

Thay vào đó reload chức năng từ các module importlib nên được sử dụng:

https://docs.python.org/3/library/importlib.html#importlib.reload

Nhưng lưu ý rằng thư viện này đã có một số API thay đổi với hai phiên bản nhỏ ngoái.

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