프로세스의 상태를보고 싶을뿐입니다. 프로세스에 콘솔을 연결할 수 있으므로 프로세스 내에서 함수를 호출하고 일부 전역 변수를 볼 수 있습니다.
프로세스가 영향을받지 않고 실행되는 것이 좋습니다 (물론 성능이 약간 저하 될 수 있음)
답변
프로그램의 소스 코드에 액세스 할 수있는 경우이 기능을 비교적 쉽게 추가 할 수 있습니다.
레시피 576515 참조 :Debugging a running python process by interrupting and providing an interactive prompt (Python)
인용하려면 :
이것은 그것을 사용하는 모든 파이썬 프로그램이 현재 지점에서 중단되고 일반 파이썬 대화 형 콘솔을 통해 통신 할 수 있도록하는 코드를 제공합니다. 이를 통해 지역, 전역 및 관련 프로그램 상태를 조사하고 임의의 함수 및 클래스를 호출 할 수 있습니다.
사용하려면 프로세스가 모듈을 가져 와서 시작하는 동안 언제든지 listen ()을 호출해야합니다. 이 프로세스를 중단하기 위해 스크립트를 직접 실행하여 디버그 할 프로세스의 프로세스 ID를 매개 변수로 제공 할 수 있습니다.
대략 동일한 개념의 또 다른 구현이 rconsole에서 제공됩니다 . 문서에서 :
rconsole은 자동 완성 기능이있는 원격 Python 콘솔로, 실행중인 스크립트의 네임 스페이스를 검사하고 수정하는 데 사용할 수 있습니다.
스크립트에서 호출하려면 다음을 수행하십시오.
from rfoo.utils import rconsole
rconsole.spawn_server()
쉘에서 연결하려면 다음을 수행하십시오.
$ rconsole
보안 참고 : spawn_server ()로 시작된 rconsole 리스너는 모든 로컬 연결을 허용하므로 공유 호스팅 또는 유사한 환경에서 사용하기에 안전하지 않을 수 있습니다!
답변
스레드에서 시작하지 않는 한 프로세스가 중단되지만 code
모듈을 사용하여 Python 콘솔을 시작할 수 있습니다 .
import code
code.interact()
사용자가를 실행하여 대화 형 콘솔을 종료 할 때까지 차단됩니다 exit()
.
이 code
모듈은 적어도 Python v2.6 이상에서 사용할 수 있습니다.
저는이 접근 방식을 Linux 작업을위한 신호와 함께 사용하는 경향이 있습니다 (Windows의 경우 아래 참조). 나는 이것을 파이썬 스크립트의 맨 위에칩니다.
import code
import signal
signal.signal(signal.SIGUSR2, lambda sig, frame: code.interact())
그리고 함께 쉘에서 트리거 kill -SIGUSR2 <PID>
, <PID>
프로세스 ID이다. 그런 다음 프로세스는 수행중인 작업을 중지하고 콘솔을 표시합니다.
Python 2.6.2 (r262:71600, Oct 9 2009, 17:53:52)
[GCC 3.4.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
일반적으로 거기에서 뛰어난 WinPDB 와 같은 원격 디버거의 서버 측 구성 요소를로드합니다 .
Windows는 POSIX 호환 OS가 아니므로 Linux와 동일한 신호를 제공하지 않습니다. 그러나 Python v2.2 이상은 Windows 관련 신호를 노출합니다SIGBREAK
( CTRL
+ 를 눌러 트리거 됨 Pause/Break
). 이것은 정상적인 + ( ) 작동을 방해 하지 않으므로 편리한 대안입니다.CTRL
C
SIGINT
따라서 위의 휴대용이지만 약간 못생긴 버전은 다음과 같습니다.
import code
import signal
signal.signal(
vars(signal).get("SIGBREAK") or vars(signal).get("SIGUSR2"),
lambda sig, frame: code.interact()
)
이 접근 방식의 장점 :
- 외부 모듈 없음 (모든 표준 Python 항목)
- 트리거 될 때까지 리소스를 거의 사용하지 않음 (가져 오기 2 회)
다음은 WinPDB (사용 가능한 경우)의 서버 측을로드하고 Python 콘솔을 여는 것으로 돌아가는 프로덕션 환경에서 사용하는 코드입니다.
# Break into a Python console upon SIGUSR1 (Linux) or SIGBREAK (Windows:
# CTRL+Pause/Break). To be included in all production code, just in case.
def debug_signal_handler(signal, frame):
del signal
del frame
try:
import rpdb2
print
print
print "Starting embedded RPDB2 debugger. Password is 'foobar'"
print
print
rpdb2.start_embedded_debugger("foobar", True, True)
rpdb2.setbreak(depth=1)
return
except StandardError:
pass
try:
import code
code.interact()
except StandardError as ex:
print "%r, returning to normal program flow" % ex
import signal
try:
signal.signal(
vars(signal).get("SIGBREAK") or vars(signal).get("SIGUSR1"),
debug_signal_handler
)
except ValueError:
# Typically: ValueError: signal only works in main thread
pass
답변
pyrasite-shell을 사용하십시오 . 나는 그것이 그렇게 잘 작동한다고 믿을 수는 없지만 작동합니다. ” 그에게 pid를 줘, 쉘을 얻으십시오 “.
$ sudo pip install pyrasite
$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope # If YAMA activated, see below.
$ pyrasite-shell 16262
Pyrasite Shell 2.0
Connected to 'python my_script.py'
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> globals()
>>> print(db_session)
>>> run_some_local_function()
>>> some_existing_local_variable = 'new value'
이렇게하면 실행중인 파이썬 프로세스의 globals () 및 locals () 변수 및 기타 멋진 기능에 액세스 할 수있는 파이썬 셸이 시작됩니다.
우분투에서만 개인적으로 테스트했지만 OSX도 지원하는 것 같습니다.
이 답변 에서 수정되었습니다 .
참고 : ptrace_scope
속성을 끄는 행 은 CONFIG_SECURITY_YAMA
on 으로 빌드 된 커널 / 시스템에만 필요합니다 . 특정 보안 취약성을 도입 할 수 있으므로 민감한 환경에서 ptrace_scope를 엉망으로 처리하십시오. 자세한 내용은 여기 를 참조 하십시오 .
답변
단순히 pdb 모듈을 사용하지 않는 이유는 무엇 입니까? 스크립트를 중지하고, 요소 값을 검사하고, 코드를 한 줄씩 실행할 수 있습니다. 그리고 파이썬 인터프리터를 기반으로 구축 되었기 때문에 클래식 인터프리터가 제공하는 기능도 제공합니다. 그것을 사용하려면, 중지하고 검사하려는 코드에 다음 두 줄을 넣으십시오.
import pdb
pdb.set_trace()
답변
파이썬 스크립트에 내용을 추가하지 않는 또 다른 가능성은 다음과 같습니다.
https://wiki.python.org/moin/DebuggingWithGdb
안타깝게도이 솔루션은 최소한 디버깅 기호가 포함 된 Python 버전을 사용해야하는 정도의 사전 고려가 필요합니다.
답변
PyCharm을 사용하여 Ubuntu에서 프로세스에 연결하는 데 실패했습니다. 이에 대한 수정 사항은 YAMA를 비활성화하는 것입니다. 자세한 내용은 askubuntu를 참조하십시오 .
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope