【问题标题】:How to get output type from Popen stdout如何从 Popen stdout 获取输出类型
【发布时间】:2020-07-26 05:23:49
【问题描述】:

我正在制作自动评分器,但我无法从标准输出中获取“test_file”的输出类型, 像我的 test_file 返回整数但标准输出总是作为字符串 附言。如果我的代码不好或者有更好的方法,请给我建议。

    def check_output(test_file, result_file, in_type, out_type, input):
        if check_type(in_type, input):
            process1 = Popen(["python", test_file], stdin=PIPE, stdout=PIPE, stderr=PIPE)
            process1.stdin.write(str(input).encode())
            stdout = process1.communicate()[0]
            output1 = stdout.decode()
            print("Test: " + output1)
            if check_type(output1, out_type):
                print("YES")
    
    
    def check_type(type1, type2):
        return type(type1) == type(type2)

【问题讨论】:

  • 打印输出没有类型。如果您需要类型信息,则必须更改与正在评分的代码交互的方式。
  • 你运行的是 python 2 还是 python 3? 3、进程的stdout是字节流。程序不能将整数写入标准输出,实际上它需要是整数的某个字节序列化版本。也许那是 8 个字节的小端。在这种情况下,ctypes 模块会有所帮助。你能告诉我们print("Test: " + output1) 显示了什么吗?更好的是,不要解码标准输出并向我们展示原始字节。另外,程序写了什么,你期望得到什么?
  • 我希望比较来自 test_file 和 result_file 的标准输出,当两个文件的输出是字符串而不是 int 时,它可以工作。

标签: python types subprocess stdout popen


【解决方案1】:

就像从任何其他类型的文件句柄读取一样,读取标准输出的唯一可能结果是二进制bytes,或str,当字节被解码时 - 要么是因为你使用了text=True或其过时的同义词 universal_newlines=True 在调用 subprocess.Popen() 时,或者因为您明确地将 .decode() bytes,就像您在代码中所做的那样。

您的代码还有其他几个问题。您通常应该尽可能避免使用Popen;您的代码只是简单地重复 subprocess.check_output() 或其现代替代品 subprocess.run() 相当笨拙。其次,将 Python 称为 Python 的子进程通常是一种反模式。除非您正在寻求专门测试 Python 的标准输出是否包含您期望的内容(如上所述,它只能是字节或字符流),否则您最好执行代码的 import 并调用该函数你想测试,在这种情况下,它当然会通过它的return 语句返回一个原生 Python 数据类型,如果它是这样定义的。

【讨论】:

  • 这意味着我应该使用另一个功能对吗?谢谢。
  • 一般来说,是的。我们看不到另一个脚本里面有什么,所以我们不知道它的函数被调用了什么。也许也可以看看stackoverflow.com/questions/48395685/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 2017-07-14
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 2017-04-18
  • 2014-09-26
相关资源
最近更新 更多