2011-04-26 18 views
9

Khi viết hoặc gỡ lỗi chương trình Python, tôi thực sự thích sử dụng công tắc dòng lệnh -i để có thể trực tiếp kiểm tra các chức năng của mình mà không phải chạy mọi thứ từ đầu đến cuối.Cách tải lại tệp nguồn Python của tôi, khi tương tác diễn giải nó bằng "python -i"

Tuy nhiên, bất cứ khi nào tôi thực hiện thay đổi mã, tôi phải đóng và khởi động lại phiên tương tác của mình, mất tất cả các biến tạm thời mà tôi có thể đã xác định. Làm cách nào để tải lại tệp nguồn của tôi từ bên trong trình thông dịch python?


Chức năng dựng sẵn reload vẻ như nó đã được thực hiện cho điều này, nhưng tôi chỉ có thể sử dụng nó với module tên:

>> import my_prog 
>> print my_prog.x 
-- prints an error, because x is not defined -- 

-- edited my_prog.py to add the x global now... 
>> reload(my_prog) 
>> print my_prog.x 
-- prints x 

Tuy nhiên, nếu tôi thay vì để làm một from my_prog import * trong đầu lại không hoạt động và việc nhập lại cũng không có hiệu lực.

Trả lời

12

Điều này phải làm với cách Python lưu trữ mô-đun. Bạn cần một đối tượng mô-đun để chuyển sang tải lại và bạn cần phải lặp lại lệnh nhập. Có thể có một cách tốt hơn, nhưng đây là những gì tôi thường sử dụng:

>> import my_prog 
>> from my_prog import * 
*** Run some code and debug *** 
>> reload(my_prog); from my_prog import * 
*** Run some code and debug *** 
>> reload(my_prog); from my_prog import * 
+0

Được chấp nhận cho sự đồng nhất. – hugomg

+0

Xin cảm ơn! @smaplebias có mô tả kỹ lưỡng hơn cho những ai quan tâm đến chi tiết tốt hơn. +1 từ tôi. –

+0

Heh, cảm ơn Carl :-) +1 trở lại ya. – samplebias

10

Khi bạn sử dụng from my_prog import * bạn kéo biểu tượng vào phạm vi toàn cầu của thông dịch viên, vì vậy reload() không thể thay đổi những biểu tượng toàn cầu, chỉ có thuộc tính mô-đun cấp sẽ được thay đổi khi mô-đun được biên dịch lại và tải lại.

Ví dụ: myprog.py:

x = 1 

Trong interepreter:

>>> import myprog 
>>> myprog.x 
1 
>>> from myprog import x 
>>> x 
1 

Bây giờ sửa myprog.py thiết x = 2:

>>> reload(myprog) 
>>> myprog.x 
2 
>>> x 
1 

Lặp lại các from myprog import * để kéo sy các biểu tượng cho phạm vi toàn cầu một lần nữa:

>>> reload(myprog) 
>>> from myprog import * 
Các vấn đề liên quan