python:是否可以将控制台附加到正在运行的进程中
我只想查看流程的状态,是否可以在流程中附加控制台,以便调用流程中的函数并查看一些全局变量python:是否可以将控制台附加到正在运行的进程中,python,Python,我只想查看流程的状态,是否可以在流程中附加控制台,以便调用流程中的函数并查看一些全局变量 进程运行时最好不受影响(当然性能可能会下降一点)如果您可以访问程序的源代码,则可以相对轻松地添加此功能 请参阅:通过中断并提供交互式提示(python)调试正在运行的python进程 引述: 这提供了允许使用任何python的代码 使用它的程序 在当前点中断,以及 通过普通python与进行通信 交互式控制台。这允许 局部、全局和相关程序 待调查的州,以及 调用任意函数和 上课 若要使用,流程应导入 模块,
进程运行时最好不受影响(当然性能可能会下降一点)如果您可以访问程序的源代码,则可以相对轻松地添加此功能 请参阅:
通过中断并提供交互式提示(python)调试正在运行的python进程
引述:
这提供了允许使用任何python的代码
使用它的程序
在当前点中断,以及
通过普通python与进行通信
交互式控制台。这允许
局部、全局和相关程序
待调查的州,以及
调用任意函数和
上课
若要使用,流程应导入
模块,并在任意点调用listen()
在启动期间。打断这个
进程中,可以运行脚本
直接给出
进程作为参数进行调试
提供了大致相同概念的另一个实现。从文件中: rconsole是一个远程Python控制台 具有自动完成功能,可以 用于检查和修改 正在运行的脚本的命名空间 要在脚本中调用,请执行以下操作: 要从外壳连接,请执行以下操作: 安全说明:rconsole侦听器 从spawn_server()开始将 接受任何本地连接,并且可能 因此,在共享环境中使用是不安全的 托管或类似环境 为什么不简单地使用这个模块呢?它允许您停止脚本、检查元素值并逐行执行代码。由于它是基于Python解释器构建的,因此它还提供了经典解释器提供的特性。要使用它,只需将这两行代码放在您希望停止并检查它的地方:
import pdb
pdb.set_trace()
这将中断进程(除非在线程中启动),但您可以使用
code
模块启动Python控制台:
import code
code.interact()
这将一直阻止,直到用户通过执行exit()
退出交互式控制台
code
模块至少在PythonV2.6中可用,可能还有其他版本
我倾向于将这种方法与Linux工作中的信号结合使用(对于Windows,请参见下文)。我将其放在Python脚本的顶部:
import code
import signal
signal.signal(signal.SIGUSR2, lambda sig, frame: code.interact())
然后使用kill-SIGUSR2
从shell触发它,其中
是进程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)
>>>
一般来说,我将从那里加载远程调试器的服务器端组件,如优秀的
Windows不是一个兼容的操作系统,因此不能提供与Linux相同的信号。但是,(按CTRL
+暂停/中断
触发)。这不会干扰正常的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
另一种不向python脚本添加内容的可能性如下所述: 不幸的是,这个解决方案还需要一些预先考虑,至少在某种程度上,您需要使用带有调试符号的python版本。使用。我不敢相信它工作得这么好,但确实如此。“给它一个pid,得到一个shell” 这将启动pythonshell,并访问正在运行的python进程的globals()和locals()变量以及其他奇妙的东西 仅在Ubuntu上进行了个人测试,但似乎也适合OSX 改编自
注意:关闭
ptrace\u scope
属性的行仅对在CONFIG\u SECURITY\u YAMA
打开的情况下构建的内核/系统是必需的。小心在敏感环境中干扰PTU范围,因为它可能会引入某些安全漏洞。有关详细信息,请参阅。使用PyCharm,我无法连接到Ubuntu中的进程。解决方法是禁用YAMA。有关更多信息,请参阅
将Python调试器附加到长时间运行的进程对我们来说效果很好
作者描述如下:
这个软件包是为了回应调试长时间运行的进程所带来的挫折。将pdb附加到正在运行的python程序并查看发生了什么不是很好吗?这正是pdb attach所做的
在主模块中按如下方式进行设置:
导入pdb\u附加
pdb_连接。监听(50000)#监听端口50000。
当程序运行时,通过从命令行调用pdb_attach将程序的PID和端口传递到pdb_attach.listen()
:
$python-m pdb_attach 50000
(Pdb)#像平常一样与Pdb互动
基本上,调试器?类似于命令行解释器python.exepdb版本:这是一个非常好的方法。使用管道和文件进行输入和输出是非常聪明的,我认为任何一个体面的项目都会从这种功能中受益。但它非常不安全,所以使用care我尝试了这个方法,结果破坏了我的python安装模块'object'has no attribute'getmro'I在向代码添加存根并启动rpc服务器后编译了cython扩展,但是rconsole在任何操作中都会不光彩地中断rfoo.\u rfoo.eoferor:0
能否提供有关如何加载WinPDB o服务器端组件的更多详细信息
import code
import signal
signal.signal(
vars(signal).get("SIGBREAK") or vars(signal).get("SIGUSR2"),
lambda sig, frame: code.interact()
)
# 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
$ 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'
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope