python - Python os.system() 返回错误值
问题描述
背景:我正在使用带有 os.system() 的 Python 脚本来重复调用命令行程序来运行测试用例。被测试的程序对于正常操作返回零,对于错误条件返回负值。作为确定通过/失败的一部分,我将此值与预期值(不总是零)进行比较。
问题是正常退出的测试用例返回零,但 os.system() 返回 -1073740940。到目前为止,其他非零回报都按预期工作,尽管样本很小。
我相当有信心被调用的程序返回零,因为我在返回之前将返回值输出到标准输出。此外,如果从命令行或批处理文件使用相同的输入运行程序,则返回值为零。
可能相关的是,C++ 程序使用 ofstream 生成一个日志文件,其内容与命令行相同 - 相同的缓冲区被发送到 std::cout 和日志文件。当由 os.system() 调用控制时,即使 cout 信息正常继续,日志文件内容也会在程序执行的 80% 处停止。与返回值一样,如果使用命令行或批处理文件的相同输入运行,日志文件将正确完成并具有与终端相同的内容。
对于返回值和日志文件问题,Python 2.7 和 3.8 下的行为是相同的。
我的问题是:我该如何诊断?我不确定还能尝试什么。
解决方案
您正在使用 os.system,它不会像您期望的那样返回退出代码,而是一些不同的东西。
在https://docs.python.org/3.8/library/os.html#os.system你可以阅读
在 Unix 上,返回值是以 wait() 指定的格式编码的进程的退出状态。注意,POSIX 没有指定 C 函数 system() 函数的返回值的含义,所以 Python 函数的返回值是系统相关的。
所以要么使用subprocess.call
或做类似的事情
rslt = os.system("whatever")
exit_code = 0xff & rslt
推荐阅读
- kubernetes - Apache Nifi 准备好在生产环境中与 Kubernetes 一起使用了吗?
- python - AttributeError:'function'对象没有属性'fit'
- c# - 与 oracle db 的连接在 Oracle.DataAccess.dll 中给出 System.TypeInitializationException'?
- python - 重复不重叠的子串
- objective-c - 如何将 swift NSLayoutConstraint activateConstraints 转换为目标 c?
- python - 使用 Scrapy 从动态网页中抓取 url
- kubernetes - 通过proxy和clusterIP连接Kube集群?
- redis - Vertx 3.7.0+ 使用 RedisAPI - mgetMany 的对应物
- r - 用 MICE 估算分类变量但限制可能的值
- printing - PL/pgSQL:找不到“raise notice”语句的输出