我正在编写一个Python程序,用于在Linux服务器上运行用户上传的任意(因此,在最坏的情况下,不安全,错误和崩溃)代码.抛开安全问题,我的目标是确定代码(可能是任何语言,编译或解释)是否写入了正确的内容stdout,stderr以及给定输入的其他文件是否输入到程序中stdin.在此之后,我需要向用户显示结果.
目前,我的解决办法是使用产卵子进程subprocess.Popen(...)与文件句柄stdout,stderr和stdin.后面的文件stdin句柄包含了操作过程中的程序读取输入,并且该程序已终止后,将stdout和stderr文件的读取,并检查正确性.
这种方法非常完美,但是当我显示结果时,我无法组合给定的输入和输出,因此输入将出现在与从终端运行程序时相同的位置.即类似的程序
print "Hello."
name = raw_input("Type your name: ")
print "Nice to meet you, %s!" % (name)
Run Code Online (Sandbox Code Playgroud)
stdout运行后,包含该程序的文件的内容将是:
Hello.
Type your name:
Nice to meet you, Anonymous!
Run Code Online (Sandbox Code Playgroud)
鉴于内容包含该文件stdin是Anonymous<LF>.所以,简而言之,对于给定的示例代码(以及,等效地,对于任何其他代码),我想实现如下结果:
Hello.
Type your name: Anonymous
Nice to meet you, Anonymous!
Run Code Online (Sandbox Code Playgroud)
因此,问题是检测程序何时等待输入.
我尝试了以下方法来解决问题:
这允许父进程沿管道单独发送数据,但只能调用一次,因此不适用于具有多个输出和输入的程序 - 正如可以从文档中推断出来的那样.
我有许多pl/sql程序,可能需要几分钟才能运行.在开发它们时,我添加了一些打印语句来帮助调试,并提供一些反馈和进度指标.最初,我在小型测试装置上运行这些,输出几乎是瞬间完成的.既然我正在测试需要花费几分钟才能运行的更大的测试集,我发现打印到控制台不再合适,因为在程序结束之前不会打印任何内容.我习惯于在不缓冲输出并立即打印的环境中工作,并且添加简单的打印语句以进行简单的调试和诊断很常见.
是否可以在pl/sql中立即打印输出(不缓冲)?如果没有,人们建议采用哪些替代方案来获得类似的结果?
我有一个像这样的脚本:
#!/bin/bash
exec /usr/bin/some_binary > /tmp/my.log 2>&1
Run Code Online (Sandbox Code Playgroud)
问题是它将some_binary所有日志记录发送到stdout,并且缓冲使得它只能看到几行的块输出.当一些事情陷入困境时,这很烦人,我需要看看最后一行说的是什么.
有没有办法让stdout在我执行会影响some_binary的exec之前没有缓冲,所以它有更多有用的日志记录?
(包装器脚本只在exec之前设置一些环境变量,因此perl或python中的解决方案也是可行的.)
我观察到有时在C程序中,如果我们printf在分段错误之前的任何地方都有代码,它就不会打印.为什么会这样?
嗨,根据这篇文章,unbuffer通过伪终端(pty)连接到命令,这使得系统将其视为交互式进程,因此不使用任何stdout缓冲.
我想在Windows上使用此功能.我可以知道unbufferWindows 上程序的等价物吗?谢谢.
我使用 NppExec/Notepad++ 运行 Python 脚本,并在运行时连续刷新输出缓冲区,以使用print语句更新控制台窗口(默认缓冲输出仅在脚本执行完成后显示所有打印语句)。
此链接显示您所需要做的就是使用该命令python -u来获取无缓冲的输出。无论使用什么编辑器,对所有Python 脚本使用此执行模式是否有缺点?我不清楚缓冲输出和无缓冲输出之间的区别。
编辑:我包含了这个小的 Python 计时器脚本作为示例:
#!usr/bin/env python
import time
import threading
import sys
class Timer(threading.Thread):
def __init__(self, seconds):
self.runTime = seconds
threading.Thread.__init__(self)
def run(self):
counter = self.runTime
for sec in range(self.runTime):
print counter
time.sleep(1.0)
counter -= 1
print "Done."
if __name__ == '__main__':
t = Timer(10)
t.start()
Run Code Online (Sandbox Code Playgroud)
在这种情况下,缓冲和无缓冲输出在效率方面有多大差异?
以下代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t mypid = getpid();
write(1, &mypid, sizeof(pid_t));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
打印乱码而不是实际的pid.为什么?