有什麼方法可以在不關閉 JMP 會話的情況下清除 JMP 的 Python 端的「所有內容」(類似於 JSL 中的 Delete Symbols() 或重新啟動核心的方法)?
我正在與我的同事利用 JMP Python 整合開發應用程序,當我們對 Python 程式碼進行更改時,我們必須不斷關閉 JMP。我們這樣做是為了「清除」Python,因為我們遇到舊的 Python 程式碼位於記憶體中並且導入不會覆蓋已導入的程式碼的問題。
更新了被忽略的模組。許多驚喜和奇蹟 - 直到你注意到...
啊!
德爾有用嗎?
import sys
print(sys.path)
del sys
print(sys.path)
有問題。在大多數 Python 腳本中,這個問題不會引起太多注意,因為 Python 本身的生命週期通常與腳本相同。您會開始注意到,如果您以互動方式執行 Python 較長的會話,並在同一個互動式會話中執行多項操作。由於一些 Python 套件是用 C/C++(甚至 Fortran)實現的,例如 NumPy,這使得情況變得更加複雜。 Python 將它們載入為共享庫,除了重新啟動之外,沒有安全的方法可以從正在運行的進程中卸載共享庫。 JMP與Python共享庫本身處於類似的位置,它不能被卸載。是的, del 的作用是釋放物體。但是,del sys 並沒有按照您的預期進行操作。這不是刪除或卸載“模組”或卸載依賴的 dll,它只是刪除保存對已載入模組的引用的“sys”物件。另一方面是sys是Python內建模組,與載入的模組不同。進一步刪除“sys”不會清除您可能所做的任何更改,例如將另一個路徑附加到 sys.path。
如果你這樣做:
sys.path.append('/usr/local/bin')
print(sys.path)
del sys
print(sys.path). # gives error on sys
import sys
print(sys.path). # still contains the /usr/local/bin addition
以上是在終端機視窗中的互動式會話中運行的。只有退出 Python 並重新啟動才能從 sys.path 中清除 /usr/local/bin 。唯一真正的方法是追蹤會話中使用的所有變量,然後在「會話」結束時刪除它們。一種方法是將每個變數放入清單或字典中,然後在會話結束時刪除容器。
我正在研究Python子解釋器的使用,它可以允許設定不在全域環境中運行的程式碼,子解釋器的想法是獨立的,關閉子解釋器就像關閉一樣重新啟動Python。目前,我還沒有找到在 JMP 會話的生命週期內安全關閉並重新啟動主 Python 解釋器的方法。
目前Python重新載入模組的做法(從Python 3.4開始)是
<SPAN class="hljs-keyword">import</SPAN> importlib
importlib.reload(modulename)
嘗試重新加載系統給出
>>> importlib.reload(sys)
重新載入 numpy,給出以下輸出......
>>> importlib.reload(np)
/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/importlib/__init__.py:169: UserWarning: The NumPy module was reloaded (imported a second time). This can in some cases result in small but subtle issues and is discouraged.
_bootstrap._exec(spec, module)
請注意用戶警告:
使用者警告:NumPy 模組已重新載入(第二次導入)。在某些情況下,這可能會導緻小而微妙的問題,因此不鼓勵這樣做。 _bootstrap._exec(規範,模組)
即使使用“官方”方式重新加載模組也可能會導致問題。
importlib.reload() 非常適合在程式碼中開發 Python 模組時,因為模組來源的變更只有在重新載入後才會反映出來。這可能會強制將 Python 程式碼重新編譯為 .pyc。