【问题标题】:Python3 is not printing the output in the desired order when using subprocess.call使用 subprocess.call 时,Python3 未按所需顺序打印输出
【发布时间】:2022-01-23 13:13:32
【问题描述】:

我试图用 Python3 编写一个自动化任务并使用subprocess.call,因为我需要运行一些 shell 命令作为脚本的一部分,但发现其中一个输出没有按我预期的正确顺序打印。

部分:

在 Python2 上:

[root@server101 ~]# cat check_kernel.py
#!/usr/bin/env python
import subprocess
print "Current running kernel version on the system is:\n", subprocess.call(["uname", "-r"])

输出:

[root@server101 ~]# ./check_kernel.py
Current running kernel version on the system is:
3.10.0-1160.45.1.el7.x86_64
0

在 Python3 上:

[root@server101 ~]# cat check_kernel.py
#!/usr/bin/env python3
import subprocess
print ("Current running kernel version on the system is:\n", subprocess.call(["uname", "-r"]))

输出:

[root@server101 ~]# ./check_kernel.py
3.10.0-1160.45.1.el7.x86_64
Current running kernel version on the system is:
 0

那么在使用 Python3 时,subprocess.call 的真正区别是什么?

我是否遗漏了什么或者我不应该在 Python3 中使用 subprocess.call 并将其更改为 subprocess.run 或 subprocess.Popen 是让子进程与 Python3 一起使用的唯一方法?。

【问题讨论】:

  • 这能回答你的问题吗? Retrieving the output of subprocess.call()
  • 发生的情况是首先子进程运行,它自己打印输出,然后返回0,然后print才能执行,你得到你自己的字符串+0
  • 亚当,在说它是重复的帖子之前,你是说在 Python3 上 subprocess.call 行为总是这样吗?如果你用 python2 检查相同的代码,它工作正常。只是想知道有什么区别。
  • 不,在 Python 2 中也是如此。call() 返回子进程的退出代码 docs.python.org/2.7/library/subprocess.html#subprocess.call
  • 你能用#!/usr/bin/env python 运行同一个吗?你可以看到它打印出所需的输出。

标签: python-3.x linux subprocess


【解决方案1】:

您的子进程自己打印输出,函数返回返回码。打印顺序可能会受到 Python 的输出缓冲设置的影响。

只需使用subprocess.check_output 即可获取该命令将打印的输出。

import subprocess, shutil
print ("Current running kernel version on the system is:\n", subprocess.check_output([shutil.which("uname"), "-a"]))

编辑

正如我想象的那样,Python 2 版本是

print "Current running kernel version on the system is:\n", subprocess.call(["uname", "-r"])

Python 2 打印 语句 按顺序计算和打印每个表达式。

Python 3 的 print 函数 只是一个普通函数,所以首先计算参数,然后函数打印计算值

由于调用 uname 的副作用是打印 uname,它首先被打印,然后 print 做它的事情 - 打印文本和 call 的返回值,零返回码。

【讨论】:

  • 您好 AKX,感谢您的帮助,但不幸的是,这无助于消除我的疑问。如果您可以重新检查整个帖子(我在几分钟前主持了它)。问题停留在 subprocess.call 以及您在 python 2 和 3 之间看到的区别。
  • 重点是您使用的调用本身具有 uname 打印输出,但您在显然希望自己管理打印的上下文中使用它。
  • 嗯,好吧,那么运行该代码时 Python3 会发生什么?而Python2是不是很正常?
  • 在我们进一步了解这一点之前,请将您的 Python 2 脚本编辑为您的原始问题,并确保该脚本确实按您的预期工作。 (由于 print 语句在 Python 3 中成为函数,因此 Python 2 和 Python 3 版本不太可能完全相同。)
  • 当然,我编辑了问题并说清楚了。现在您可以看到我想知道的内容了 :) 再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多