วิธี "นำเข้าใหม่" โมดูลไปยัง python จากนั้นโค้ดจะถูกเปลี่ยนหลังจากนำเข้า


92

ฉันมี foo.py

def foo():
    print "test"

ใน IPython ฉันใช้:

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

จากนั้นฉันเปลี่ยนเป็นfoo():

def foo():
    print "test changed"

ใน IPython ผลลัพธ์ของการเรียกใช้ยังคงเป็นtest:

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

จากนั้นฉันใช้:

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

ฉันลบfoo.pycในโฟลเดอร์เดียวกันfoo.pyแล้ว แต่ยังไม่มีโชค

ฉันขอทราบวิธีการนำเข้าโค้ดที่อัปเดตในรันไทม์ได้หรือไม่


คำตอบ:


121

สำหรับ Python 2.x

reload(foo)

สำหรับ Python 3.x

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

23
จริงๆแล้วแค่ "โหลดซ้ำ (foo)" - ไม่จำเป็นต้องระบุซ้ำ
jsbueno

2
ฉันไม่สามารถทำงานได้ ฉันกำลังรับอาร์กิวเมนต์ TypeError: reload () ต้องเป็นโมดูล
Burak

2
@Burak อาร์กิวเมนต์ที่คุณกำลังส่งผ่านไปยังreloadโมดูลหรือไม่? เช่น. คุณควรจะทำimport fooล่วงหน้า
John La Rooy

27
โปรดทราบว่าหากคุณทำfrom foo import *หรือไม่ได้กำหนดfrom foo import barสัญลักษณ์fooไว้ คุณจำเป็นต้องimport sysแล้วreload(sys.modules['foo'])หรือบางทีอาจจะreload(sys.modules[bar.__module__])
drevicko

3
ขอให้ Python 2.x ตาย asp และหยุดรองรับ Python 2.x! นับถอยหลังสำหรับการเกษียณอายุของงูหลาม 2.x pythonclock.org
Martijn van Wezel

66

นอกจากคำตอบของ gnibbler:

สิ่งนี้เปลี่ยนใน Python 3 เป็น:

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

ดังที่ @onnodb ชี้ให้เห็นว่าimpเลิกใช้แล้วimportlibเนื่องจาก Python 3.4:

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

5
เพียงเล็กน้อย: ใน Python 3.x เวอร์ชันที่ใหม่กว่า "imp" จะเลิกใช้งานตาม "importlib" ทำงานในลักษณะเดียวกันแม้ว่า
onnodb

55

คุณสมบัติโหลดอัตโนมัติของIPython3ทำงานได้ดี

ฉันใช้ตัวอย่างจริงจากหน้าเว็บ ขั้นแรกให้โหลดคุณสมบัติ 'โหลดอัตโนมัติ'

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

จากนั้นนำเข้าโมดูลที่คุณต้องการทดสอบ:

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

เปิด foo.py ในโปรแกรมแก้ไขและเปลี่ยน some_function เพื่อส่งคืน 43

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

นอกจากนี้ยังใช้งานได้หากคุณนำเข้าฟังก์ชันโดยตรง

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

ทำการเปลี่ยนแปลงใน some_function เพื่อส่งคืน 43

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

1
from foo import some_function ไม่ทำงานภายใต้ Jupyterlab Python 3.7.3
Robert Nowak

7

หากคุณต้องการให้สิ่งนี้เกิดขึ้นโดยอัตโนมัติมีโมดูลโหลดอัตโนมัติที่มาพร้อมกับ iPython


from foo import some_function ไม่ทำงานภายใต้ Jupyterlab Python 3.7.3
Robert Nowak

@Robert Nowak ฉันพบสิ่งนี้ แต่มันใช้งานได้เมื่อฉันพยายามเพียงแค่ "import some_function" โดยไม่มี "from foo" ในโค้ดของฉันในภายหลังหลังจากต้นฉบับจาก foo import some_function
Michael Szczepaniak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.