Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:是否可以将控制台附加到正在运行的进程中_Python - Fatal编程技术网

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