簡體   English   中英

python3.7中的模塊重新加載如何工作?

[英]How does module reload in python3.7 work?

如何在python 3.7.1中重新加載模塊?

設置和摘要

我在Linux中運行python 3.7.1。 我正在開發一個C模塊,一旦更改了模塊就可以很方便地重新加載它。 我遵循了如何卸載(重新加載)Python模塊? ,但我無法在這種環境下使用它。

為了演示我的問題,我在教程中基於SPAM示例編寫了一個簡單的模塊,該模塊返回模塊的構建時間。 它將永遠不會被重新加載。

該實現是該教程中的垃圾郵件示例。 它有一個函數hello,它返回構建時間:

return Py_BuildValue("s", __TIME__);

我正在使用以下python腳本進行編譯和加載:

import os
import helloworld
print(helloworld.hello('test'))
os.system("touch helloworld.c")
os.system("python3 setup.py build")
os.system("python3 setup.py install --user")
from importlib import reload
helloworld=reload(helloworld)
print(helloworld.hello('test'))

導入模塊,觸摸主文件,編譯並安裝,然后重新加載。

產量

重新加載后,模塊應顯示新的編譯時間,但輸出不會更改(我遺漏了一些調試消息,輸出是第一行/最后一行,08:04:20):

python driver.py
08:04:20
running build
running build_ext
building 'helloworld' extension
gcc ...
running install
running build
running build_ext
running install_lib
copying build/lib.linux-x86_64-3.7/helloworld.cpython-37m-x86_64-linux-gnu.so -> /home/wuebbel/.local/lib/python3.7/site-packages
running install_egg_info
Removing /home/wuebbel/.local/lib/python3.7/site-packages/HelloWorld-2.1-py3.7.egg-info
Writing /home/wuebbel/.local/lib/python3.7/site-packages/HelloWorld-2.1-py3.7.egg-info
08:04:20

再次運行腳本將加載正確的模塊並顯示新時間:

wuebbel@02e267406db3:~/Projekte/Mandelbrot Demos/helloworld$ python driver.py
08:16:58
...
08:16:58

看來我的模塊永遠都不會重新加載。 正確的做法是什么?

我對重新加載包含已編譯代碼的模塊的可行性感到懷疑,請閱讀以下答案: https : //stackoverflow.com/a/48814213/6451573 ,這表明PEP 489更改了模塊重新加載(在python 3.6和3.7之間),可能是“破壞共享庫重載。

由於共享庫加載的限制(POSIX上的dlopen和Windows上的LoadModuleEx都受限制),在磁盤上更改修改后的庫后,通常無法加載它。

那可以解釋您遇到的問題。

如果是可行的情況,我建議您有一個主python程序來創建程序包,然后使用單獨的python進程來加載它。

subprog.py:

import helloworld
print(helloworld.hello('test'))

master.py

import os,subprocess,sys
def runit():
   subprocess.run([sys.executable,os.path.join(os.path.dirname(__file__),"subprog.py")])

runit()

os.system("touch helloworld.c")
os.system("python3 setup.py build")
os.system("python3 setup.py install --user")

runit()

使用sys.executable可以確保將相同的python可執行文件用於主python進程和子進程,因此更加透明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM