Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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 将GDB作为具有完全用户交互的进程运行_Python - Fatal编程技术网

Python 将GDB作为具有完全用户交互的进程运行

Python 将GDB作为具有完全用户交互的进程运行,python,Python,我试图创建一个简单的python程序,该程序调用gdb进程,并允许用户与gdb进行双向交互。首先,我做了如下工作: import subprocess import sys def runProcessNonBlocking(command, shell=False, cwd = None): if not shell: command = command.split() p = subprocess.Popen(command,

我试图创建一个简单的python程序,该程序调用gdb进程,并允许用户与gdb进行双向交互。首先,我做了如下工作:

import subprocess
import sys

def runProcessNonBlocking(command, shell=False, cwd = None):

    if not shell:
        command = command.split()

    p = subprocess.Popen(command,
                        shell=shell,
                        cwd=cwd,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.STDOUT,
                        bufsize=1)

    while(True):
        # returns None while subprocess is running
        retcode = p.poll()
        line = p.stdout.readline()
        yield line
        if retcode is not None:
            break

if __name__ == "__main__":

    cmd = "gdb"

    try:
        for line in runProcessNonBlocking(cmd, shell=True):
            line_encoded = line.decode('utf-8', 'ignore')
            print(line_encoded)

    except Exception as E:
        print("    Error: cannot run the command: %s" % E)
        sys.exit(2)

代码以进程的形式运行GDB,我可以键入命令并获得输出。然而,问题是我看不到我在GDB提示符上输入的内容。我在这里遗漏了什么?

您的代码有一个问题,如何运行它有一个问题

while(True):
#在子进程运行时返回None
retcode=p.poll()
line=p.stdout.readline()
生产线
如果retcode不是None:
打破
在上面的块中,您自己正在阻止进程输出,直到它生成一行。这将导致在出现新行字符之前不会出现任何回音,从而使您感觉没有显示正在键入的内容

第二个问题是默认情况下python以缓冲模式运行。你需要禁用它。现在有多种方法可以做到这一点

$pythonnubffered=true python3 test.py

$python3-u test.py
但这将取决于我们如何运行它。因此,我们甚至在代码中通过确保打印语句在使用时立即刷新来解决这一问题

下面是更新的代码

导入子流程
导入系统
def runProcessNonBlocking(命令,shell=False,cwd=None):
如果不是壳牌公司:
command=command.split()
p=子进程.Popen(命令,
bufsize=1,
外壳=外壳,
cwd=cwd,
stdout=子流程.PIPE,
stderr=subprocess.STDOUT)
虽然(正确):
#在子进程运行时返回None
retcode=p.poll()
行=p.stdout.read(1)
生产线
如果retcode不是None:
打破
如果名称=“\uuuuu main\uuuuuuuu”:
导入操作系统
cmd=[“gdb”]
尝试:
对于runProcessNonBlocking(cmd,shell=True)中的行:
line_encoded=line.decode('utf-8','ignore')
打印(行_编码,结束='',刷新=真)
例外情况除外,如E:
打印(“错误:无法运行命令:%s”%E)
系统出口(2)

主进程的标准输出已连接到控制台。子进程的标准输出未连接到控制台。谢谢@Tarun。我正在使用python日志记录。
print(line\u encoded,end='',flush=True)
在日志记录中是否有类似于
log.info(line\u encoded,flush=True)
@ManiAm,抱歉,我不确定这一点。我查过了,没找到