【问题标题】:Why does this open software code run the same command line argument twice?为什么这个开放的软件代码两次运行相同的命令行参数?
【发布时间】:2019-12-27 06:20:41
【问题描述】:

我正在构建一个在线法官,它接受用户的 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)

【问题讨论】:

  • 我的第一个想法是 retval 之后会被使用,但只有当 retval 为零时,代码才会到达那个点。那么,它可能只是糟糕的代码?

标签: python subprocess


【解决方案1】:

在这种情况下,看起来这只是糟糕的代码。

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

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

另外一点:除了运行不受信任的 C++ 代码通常是不安全的这一事实之外,如果文件名是用户提供的并且没有得到适当的清理,则使用 shell=True 会创建 its own security concerns

【讨论】:

  • 好的,感谢您确认没有必要!在这种情况下,我应该用 subprocess.check_call() 替换这两行吗?
  • @EvanWild 你可能只用一个 subprocess.check_output 就可以做到——它将涵盖返回代码和编译器错误消息(如果你想将它们报告给提交代码的用户)
  • 没问题;很高兴能帮助你。感谢您不只是盲目地信任此代码;尝试理解设计决策(好的和坏的)总是一个好的步骤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2013-07-05
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
相关资源
最近更新 更多