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을 대화형으로 실행하면 눈에 띄기 시작할 것입니다.이는 NumPy와 같이 일부 Python 패키지가 C/C++(및 Fortran)로 구현되어 더욱 복잡해집니다.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)
sys를 다시 로드하려고 하면
>>> 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)
사용자 경고를 참고하세요:
UserWarning: NumPy 모듈이 다시 로드되었습니다(두 번째로 가져옴). 이는 어떤 경우에 사소하지만 미묘한 문제를 초래할 수 있으며 권장되지 않습니다. _bootstrap._exec(spec, module)
'공식적인' 방법을 사용해도 모듈을 다시 로드하면 문제가 발생할 수 있습니다.
importlib.reload()는 코드에서 Python 모듈을 개발할 때 매우 효과적입니다. 모듈 소스의 변경 사항은 다시 로드할 때까지 반영되지 않기 때문입니다. 잠재적으로 Python 코드의 .pyc로 다시 컴파일해야 합니다.