小编Zac*_*ack的帖子

在进程中安全地运行代码,在多线程.Process中重定向stdout

我正在研究MOOC的数据集.我有很多python3代码片段,我需要运行并从中获取结果.为此,我编写了一个循环遍历每个片段的python脚本.对于每个片段我:

  1. 创建新的StringIO对象
  2. 设置sys.stdoutsys.stderr我的stringIO缓冲区
  3. threading.thread对象中执行代码段
  4. 加入主题
  5. 将结果记录在stringIO缓冲区中
  6. 恢复stdout和stderr

这适用于"正确"的代码,但在其他情况下这有问题:

  • 当代码具有无限循环时,thread.join不会终止该线程.该线程是一个守护程序线程,因此它在后台安静地运行,直到我的循环结束.
  • 当代码具有带a的无限循环时print(),当我将其设置回默认值(远离StringIO缓冲区)时,线程开始覆盖我的实际标准输出.这会污染我的报告.

这是我目前的代码:

def execCode(code, testScript=None):
    # create file-like string to capture output
    codeOut = io.StringIO()
    codeErr = io.StringIO()

    # capture output and errors
    sys.stdout = codeOut
    sys.stderr = codeErr

    def worker():
        exec(code, globals())

        if testScript:
            # flush stdout/stderror
            sys.stdout.truncate(0)
            sys.stdout.seek(0)
            # sys.stderr.truncate(0)
            # sys.stderr.seek(0)
            exec(testScript)

    thread = threading.Thread(target=worker, daemon=True)
    # thread = Process(target=worker) #, stdout=codeOut, stderr=codeErr)
    thread.start()
    thread.join(0.5)  # 500ms

    execError = codeErr.getvalue().strip() …
Run Code Online (Sandbox Code Playgroud)

python multithreading stdout python-3.x

7
推荐指数
1
解决办法
477
查看次数

为什么我的变量没有更新?

我已经定义了一个具有初始值的变量.
单步执行代码时:

  • 我可以看到初始值
  • 我的函数改变了值
  • 当我稍后使用该变量时,它具有错误的值

怎么了?

注意:这是针对常见问题的参考问题.如果此处的通用答案对您没有帮助,请发布包含完整实际代码的问题.

c embedded debugging

6
推荐指数
2
解决办法
53
查看次数

标签 统计

c ×1

debugging ×1

embedded ×1

multithreading ×1

python ×1

python-3.x ×1

stdout ×1