다수의 실행중인 프로세스에 콘솔을 사용합니까?
프로세스의 상태를보고 싶을뿐입니다. 프로세스에 콘솔을 존재하는지, 프로세스 내부의 함수를 호출하고 일부 전역 변수를 볼 수 있습니다.
프로세스가 영향을받지 않고 실행되는 것이 좋습니다 (물론 약간의 성능이 있음)
프로그램의 소스 코드에 액세스 할 수있는 경우이 기능을 쉽게 추가 할 수 있습니다.
레시피 576515 참조 :Debugging a running python process by interrupting and providing an interactive prompt (Python)
인용 비용 :
이것은 사용하는 모든 기능이 현재 지점에서 중단되고 일반 기능 대화 형 콘솔을 통해 통신 할 수있는 코드를 제공합니다. 이를 통해 지역, 전역 및 관련 프로그램 상태를 조사하고 임의의 함수 및 클래스를 호출 할 수 있습니다.
사용 시작하는 프로세스가 모듈을 가져 오기 시작하는 동안 이 프로세스를 중단하기 위해 펼쳐보기를 직접 실행하여 디버그 할 프로세스의 프로세스 ID를 매개 변수로 제공 할 수 있습니다.
거의 동일한 개념의 또 다른 구현은 rconsole에서 제공합니다 . 문서에서 :
rconsole은 자동 완성 기능이있는 원격 Python 콘솔로, 실행중인 펼쳐지는 네임 스페이스를 검사하고 수정하는 데 사용할 수 있습니다.
펼쳐 놓으십시오.
from rfoo.utils import rconsole
rconsole.spawn_server()
쉘에서 연결 후 수행하십시오.
$ rconsole
보안 정보 : spawn_server ()로 시작된 rconsole 리스너는 모든 로컬 연결을 허용합니다. 공유 호스팅 또는 설치 환경에서 사용 안전하지 않을 수 있습니다!
이렇게하면 프로세스가 중단되지 않는 (스레드에서 시작하지 않는 한) code
모듈을 사용하여 Python 콘솔을 시작할 수 있습니다 .
import code
code.interact()
사용자가를 실행하여 대화 형 콘솔을 종료 할 때까지 차단 exit()
합니다.
이 code
모듈은 파이썬 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
'ProgramingTip' 카테고리의 다른 글
Perl에서 "eq"대 "=="문자열 비교 (0) | 2020.10.12 |
---|---|
왜 'git log'를 퇴직해야합니까? (0) | 2020.10.12 |
캐스팅과 강제의 차이점은 무엇입니까? (0) | 2020.10.12 |
배열을 ArrayList로 변환 (0) | 2020.10.12 |
세미콜론으로 구분 된 분열을 Python에서 사전으로 분할 (0) | 2020.10.12 |