làm thế nào để "nhập lại" mô-đun thành python sau đó mã được thay đổi sau khi nhập


89

tôi có một foo.py

def foo():
    print "test"

Trong IPython tôi sử dụng:

In [6]:  import foo
In [7]:  foo.foo()
test

Sau đó, tôi thay đổi foo()thành:

def foo():
    print "test changed"

Trong IPython, kết quả để gọi vẫn là test:

In [10]:  import foo
In [11]:  foo.foo()
test

Sau đó, tôi sử dụng:

In [15]: del foo
In [16]:  import foo
In [17]:  foo.foo()
test

Tôi xóa foo.pyccùng một thư mục foo.pytồn tại, nhưng vẫn không may mắn.

Tôi có thể biết cách nhập lại mã đã cập nhật trong thời gian chạy không?


Câu trả lời:


117

Đối với Python 2.x

reload(foo)

Đối với Python 3.x

import importlib
import foo #import the module here, so that it can be reloaded.
importlib.reload(foo)

23
Trên thực tế, chỉ cần "tải lại (foo)" - không cần phải quy lại nó
jsbueno

2
Tôi không thể làm cho nó hoạt động. Tôi getiing Lỗi Loại: tải lại () lập luận phải mô-đun
Burak

2
@Burak, Có phải đối số bạn đang chuyển cho reloadmột mô-đun không ?. ví dụ. Bạn nên làm import footrước
John La Rooy

27
Lưu ý rằng nếu bạn đã làm from foo import *hoặc from foo import bar, biểu tượng fookhông được xác định. Bạn cần import syssau đó reload(sys.modules['foo'])hoặc có lẽreload(sys.modules[bar.__module__])
drevicko

3
Vui lòng để Python 2.x chết asp và ngừng hỗ trợ Python 2.x! Đếm ngược về thời gian nghỉ hưu của python 2.x pythonclock.org .
Martijn van Wezel

65

Ngoài câu trả lời của gnibbler:

Điều này đã thay đổi trong Python 3 thành:

>>> import imp
>>> imp.reload(foo)

Như @onnodb đã chỉ ra, impkhông còn được ủng hộ importlibkể từ Python 3.4:

>>> import importlib
>>> importlib.reload(foo)

5
Chỉ là một chú thích nhỏ: Trong các phiên bản sau của Python 3.x, "imp" không được dùng nữa để thay thế cho "importlib". Tuy nhiên, hoạt động theo cùng một cách.
onnodb

54

Tính năng tải tự động của IPython3 hoạt động vừa phải.

Tôi đang sử dụng ví dụ thực tế từ trang web. Đầu tiên hãy tải tính năng 'tải tự động'.

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

Sau đó nhập mô-đun bạn muốn kiểm tra:

In []: import foo
In []: foo.some_function()
Out[]: 42

Mở foo.py trong trình chỉnh sửa và thay đổi some_ functions để trả về 43

In []: foo.some_function()
Out[]: 43

Nó cũng hoạt động nếu bạn nhập trực tiếp hàm.

In []: from foo import some_function
In []: some_function()
Out[]: 42

Thực hiện thay đổi một số chức năng để trả về 43.

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

1
từ foo nhập khẩu some_function, không làm việc làm việc theo Jupyterlab Python 3.7.3
Robert Nowak

7

Nếu bạn muốn điều này xảy ra tự động, có mô-đun tải tự động đi kèm với iPython.


từ foo nhập khẩu some_function, không làm việc làm việc theo Jupyterlab Python 3.7.3
Robert Nowak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.