2013-08-13 27 views
18

Sử dụng Cython, tôi đang phát triển một mô-đun mở rộng được xây dựng dưới dạng tệp .so. Sau đó tôi kiểm tra nó bằng cách sử dụng IPython. Trong quá trình phát triển, tôi thường xuyên phải thay đổi và xây dựng lại. Tôi cũng cần thoát khỏi vỏ IPython và nhập lại tất cả các lệnh. Nhập lại mô-đun vớiTải lại mô-đun mở rộng Python từ IPython

import imp 
imp.reload(Extension) 

không hoạt động, mã không được cập nhật. Có cách nào cho tôi để tránh khởi động lại vỏ IPython sau khi tôi xây dựng lại mô-đun?

Trả lời

16

Không thể tải lại các tiện ích mở rộng C mà không cần khởi động lại quá trình (xem this official Python bug để biết thêm thông tin).

Vì bạn đã sử dụng IPython, tôi có thể khuyên bạn nên sử dụng một trong hai giao diện quá trình như Notebook hoặc QtConsole, nếu nó được chấp nhận cho bạn. Điều này cho phép bạn dễ dàng khởi động lại quy trình hạt nhân, cho phép bạn tải lại mô-đun. Rõ ràng, điều này không thuận tiện như tải lại cho một mô-đun Python vì bạn phải thực thi lại để trở về trạng thái tương tự. Nhưng đó không phải là tránh được, do đó, điểm là để giảm thiểu sự bất tiện.

tôi thấy máy tính xách tay giao diện thuận tiện nhất cho việc phát triển mở rộng, vì nó cung cấp cách dễ nhất để có được trở lại cùng một tiểu bang:

  1. xây dựng lại phần mở rộng
  2. khởi động lại kernel
  3. Run All để thực hiện lại máy tính xách tay

và bạn quay lại trạng thái giống với phiên bản mới của tiện ích. Mileage có thể khác nhau, tùy thuộc vào cách công việc tương tác tốn kém của bạn là để chạy lại, nhưng nó đã phục vụ tôi tốt.

0

Bạn có thể thử đặt autoreload trong ipython shell, documentation here.

Set autoreload

In [1]: %load_ext autoreload 

In [2]: %autoreload 2 

Đặt autoreload trên module cụ thể

%aimport foo 

Ngoài ra, hãy nhìn vào dreload (thêm về dreloadhere) và run-magic

+4

Nó không hoạt động đối với trường hợp của tôi, tài liệu tự động tải cho biết: "Không thể tải lại mô-đun mở rộng C và do đó không thể tải tự động được." – clstaudt

-2

IPython cung cấp một cách để automatically reload modules:

In [1]: %load_ext autoreload 
In [2]: %autoreload 2 

khác mà bạn có thể sử dụng (chỉnh sửa: python 2 chỉ)

reload(module) 

Xem this answer cho python3 tải lại.

+0

Hài hước, bạn trả lời 5 giây sau tôi. Rất mát mẻ khi nó xảy ra. – enginefree

+0

'tải lại' không phải là một built-in trong Python 3 Tôi tin. – clstaudt

+0

: x Tôi đã chuyển hướng đến [câu hỏi] này (http: // stackoverflow.com/questions/5364050/reloading-submodules-in-ipython) nhưng tôi không quen thuộc với hệ thống @cls: oups, bad của tôi – Laurent

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