2009-12-15 19 views
104

Có cách nào để IPython tự động tải lại tất cả mã đã thay đổi không? Hoặc trước khi mỗi dòng được thực hiện trong trình bao hoặc thất bại khi nó được yêu cầu cụ thể. Tôi đang làm rất nhiều lập trình thám hiểm bằng cách sử dụng IPython và SciPy và nó là một nỗi đau phải tự nạp lại mỗi mô-đun bất cứ khi nào tôi thay đổi nó.Tự động tải các mô-đun trong IPython

+0

Ở đây, nó được triển khai dưới dạng phần mở rộng http: //projects.scipy.org/ipython/ipython/ticket/154 –

+0

Bạn có thể xem xét thay đổi câu trả lời được chấp nhận. – Peque

+0

Tôi nghĩ rằng nó thường công bằng để chấp nhận câu trả lời đầu tiên trả lời câu hỏi, có vẻ như một chút có nghĩa là để thay đổi nó năm sau đó! –

Trả lời

53

SỬA ĐỔI - xin vui lòng xem Andrew_1510 của answer dưới đây, như IPython đã được cập nhật.

...

Đó là một con số khó chút hiểu làm thế nào để đạt được điều đó từ một báo cáo lỗi bụi bặm, nhưng:

Nó tàu với IPython bây giờ!

import ipy_autoreload 
%autoreload 2 
%aimport your_mod 

# %autoreload? for help 

... sau đó mỗi khi bạn gọi your_mod.dwim(), nó sẽ nhận phiên bản mới nhất.

+4

Điều gì sẽ xảy ra nếu nó ít trực tiếp hơn? '% run sometest.py' chứa' import themod'. Sau khi chỉnh sửa 'themod.py', tôi muốn chỉ'% chạy sometest.py', nhưng nó không nhận các thay đổi. – Jed

+2

Tôi nghĩ rằng ipython 0,11 đã không sử dụng tính năng này. Hoặc là nó chỉ đổi tên/ẩn một nơi nào đó? – SirVer

+0

SirVer, bạn nói đúng. Thở dài. Rõ ràng, nó nằm trong gói 'cách ly': http://www.archlinux.org/packages/community/any/ipython/files/ –

165

Đối IPython phiên bản 3.1, 4.x, 5.x và

In [1]: %load_ext autoreload 

    In [2]: %autoreload 2 

Sau đó, mô-đun của bạn sẽ được tự động nạp lại theo mặc định. Đây là doc:

File:  ...my/python/path/lib/python2.7/site-packages/IPython/extensions/autoreload.py 

Docstring: 
``autoreload`` is an IPython extension that reloads modules 
automatically before executing the line of code typed. 

This makes for example the following workflow possible: 

.. sourcecode:: ipython 

    In [1]: %load_ext autoreload 

    In [2]: %autoreload 2 

    In [3]: from foo import some_function 

    In [4]: some_function() 
    Out[4]: 42 

    In [5]: # open foo.py in an editor and change some_function to return 43 

    In [6]: some_function() 
    Out[6]: 43 

The module was reloaded without reloading it explicitly, and the 
object imported with ``from foo import ...`` was also updated. 

Có một trick: khi bạn quên tất cả những điều trên khi sử dụng ipython, chỉ cần thử:

import autoreload 
?autoreload 
# Then you get all the above 
65

Như đã đề cập ở trên, bạn cần mở rộng autoreload. Nếu bạn muốn nó tự động khởi động mỗi khi bạn khởi động ipython, bạn cần phải thêm nó vào tập tin ipython_config.py khởi động:

Nó có thể là cần thiết để tạo ra một đầu tiên:

ipython profile create 

Sau đó bao gồm những dòng này trong ~/.ipython/profile_default/ipython_config.py :

c.InteractiveShellApp.exec_lines = [] 
c.InteractiveShellApp.exec_lines.append('%load_ext autoreload') 
c.InteractiveShellApp.exec_lines.append('%autoreload 2') 

cũng như một cảnh báo bắt buộc trong trường hợp bạn cần phải tận dụng lợi thế của mã Python biên soạn trong .pyc file:

c.InteractiveShellApp.exec_lines.append('print "Warning: disable autoreload in ipython_config.py to improve performance." ') 

chỉnh sửa: các công trình trên với phiên bản 0.12.1 và 0,13

+1

Điều này thực sự tuyệt vời. Tôi đã tự hỏi tại sao không ai khác đã đăng các giải pháp để bảo tồn nó. Điều này có làm việc với các phiên bản cũ của IPython không? Tôi đã sử dụng 0,12+. Tôi nhớ rằng cách ipython lưu trữ các tùy chỉnh thay đổi đáng kể. –

+0

Tôi đang sử dụng 0.12.1 và chưa thử 0.13, vì vậy tôi không biết liệu nó có hoạt động với 0.13+ –

+5

Đây là một cách tiếp cận tốt hay không, nhưng tôi nghĩ tất cả những gì bạn cần làm là điền vào các mở rộng nên ở quanh dòng 27: 'c.InteractiveShellApp.extensions = ['autoreload']' – dvreed77

2

Bạn có thể sử dụng:

import ipy_autoreload 
    %autoreload 2 
    %aimport your_mod 
8

nếu bạn thêm ipython_config.py vào ~/.ipython/profile_default dir với dòng như bên dưới chức năng tự động tải sẽ được tải lên khi khởi động ipython (thử nghiệm trên 2.0.0):

print "--------->>>>>>>> ENABLE AUTORELOAD <<<<<<<<<------------" 

c = get_config() 
c.InteractiveShellApp.exec_lines = [] 
c.InteractiveShellApp.exec_lines.append('%load_ext autoreload') 
c.InteractiveShellApp.exec_lines.append('%autoreload 2') 
Các vấn đề liên quan