为什么此开放软件代码两次运行相同的命令行参数?

时间:2019-08-22 00:25:59

标签: python subprocess

我正在建立一个在线判断器,该判断器将接受用户的c ++代码,并告诉他们其输出是否正确。目前,我正在寻找一个开源python项目,以了解如何做到这一点。在示例代码中,尽管它们执行相同的操作,但它们都运行subprocess.check_output()和subprocess.call()。由于我通常是子流程和命令行参数的初学者,所以我想知道是否有这个原因。谢谢!

    if language == "C++":
        filename = "submissions/" + str(runID) + ".cpp"
        try :
            subprocess.check_output('g++ ' + filename, stderr = subprocess.STDOUT , shell=True);
        except subprocess.CalledProcessError, e:
            return (-1 , e.output)
        retval = subprocess.call('g++ ' + filename , shell = True)
        subprocess.call('timeout 1s ./a.out < ' + inpfile + ' > ' + outfile , shell = True)

1 个答案:

答案 0 :(得分:3)

在这种情况下,这看起来像是错误的代码。

subprocess.check_output将使用指定的参数运行g++,如果编译器错误退出,则收集输出并将其保存在e中。然后返回元组(-1, output)

如果编译器第一次成功,则代码将使用相同的命令行参数再次运行编译器 ,只是为了获取返回值。但是,除非出现任何系统问题,例如刚好用完磁盘空间,否则编译器如果第一次成功,它将第二次成功(因为已经编写了输出,因此没有做任何有用的工作)。之后,将运行输出。

另一个注意事项:除了通常不安全地运行不受信任的C ++代码这一事实之外,如果文件名是用户提供的且未正确清理,则使用shell=True会创建its own security concerns。< / p>

相关问题