[python] 파이썬 : 실행중인 프로세스에 콘솔을 연결할 수 있습니까?

프로세스의 상태를보고 싶을뿐입니다. 프로세스에 콘솔을 연결할 수 있으므로 프로세스 내에서 함수를 호출하고 일부 전역 변수를 볼 수 있습니다.

프로세스가 영향을받지 않고 실행되는 것이 좋습니다 (물론 성능이 약간 저하 될 수 있음)



답변

프로그램의 소스 코드에 액세스 할 수있는 경우이 기능을 비교적 쉽게 추가 할 수 있습니다.

레시피 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). 이것은 정상적인 + ( ) 작동을 방해 하지 않으므로 편리한 대안입니다.CTRLCSIGINT

따라서 위의 휴대용이지만 약간 못생긴 버전은 다음과 같습니다.

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_YAMAon 으로 빌드 된 커널 / 시스템에만 필요합니다 . 특정 보안 취약성을 도입 할 수 있으므로 민감한 환경에서 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


답변