我試圖用 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
subprocess.call那么在使用 Python3 時發生的真正區別是什么?
我是否遺漏了某些東西,或者我不應該subprocess.call與 Python3 一起使用并將其更改為subprocess.run或者subprocess.Popen是讓子行程與 Python3 一起使用的唯一方法?
uj5u.com熱心網友回復:
您的子行程自己列印輸出,函式回傳回傳碼。列印順序可能會受到 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 print陳述句按順序計算和列印每個運算式。
Python 3 print函式只是一個常規函式,因此首先計算引數,然后該函式列印計算值
由于呼叫 uname 的副作用是列印 uname,它首先被列印,然后是 print 做它的事情 - 列印文本和 的回傳值call,零回傳碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/420073.html
標籤:
上一篇:冪等記錄創建:在插入記錄之前使用唯一約束或檢查是否存在更好?
下一篇:discord.ext.commands.errors.CommandInvokeError:命令引發例外:ValueError:對已關閉檔案的I/O操作
