[英]Python subprocess.checkoutput() exception using 'svn log'
我遇到了一個我無法解決的問題。
我正在嘗試通過 python 運行顛覆命令來處理結果。 我讓這段代碼運行我的開發系統,但是當我在目標系統上運行它時,我在子進程模塊中遇到異常。
為什么這段代碼會在我的兩個系統上產生不同的結果?
command = "svn log --username " + __SVNUSERNAME + " --password " + __SVNPASSWORD + " --no-auth-cache --non-interactive -v -r {2022-09-26}:{2022-09-27} --xml " + __SVNTRUNK
bytes = subprocess.check_output([command], stderr=subprocess.STDOUT,shell=True)
我得到以下異常:
File "E:\5_scripts\svn.py", line 89, in __run
bytes = subprocess.check_output([command], stderr=subprocess.STDOUT,shell=True)
File "C:\tools\Python3\lib\subprocess.py", line 424, in check_output
return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
File "C:\tools\Python3\lib\subprocess.py", line 528, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['{command}']' returned non-zero exit status 1.
我嘗試在命令行上運行相同的 subversion 命令,它按預期執行。 當我回顯 %ERRORLEVEL% 時,它返回狀態 0。所以我不知道在我的目標系統上發生了什么不同的事情。
我嘗試調查 python 文檔中的 checkoutput() function 並且似乎在 3.6 和 3.9 之間沒有重大更新
我嘗試調查 Apache 顛覆發行說明,但沒有發現對“日志”子命令的任何更改
開發系統:
目標系統:
這是因為您的目標系統是 Windows。具體來說, shell=True
在 Windows 和 Linux 上不起作用,或者工作方式不同。這是有道理的,因為 Windows 和 Linux 具有不同的外殼(歷史上)。
您可以嘗試以下代碼,它應該適用於兩個平台:
command = [
"svn", "log",
"--username", __SVNUSERNAME,
"--password", __SVNPASSWORD,
"--no-auth-cache", "--non-interactive", "-v",
"-r", "{2022-09-26}:{2022-09-27}",
"--xml",
__SVNTRUNK
]
bytes = subprocess.check_output(command, stderr=subprocess.STDOUT)
簡而言之,此版本不再依賴 shell 將命令字符串標記為命令數組,而是顯式構建該數組。 請注意, shell=True
已從對check_output()
的調用中刪除。
此更改可能有問題,特別是 bash 或 command.com 不會對字符串進行任何 shell 特有的處理(例如音譯環境變量)。 看起來您以前的代碼並不依賴於 shell 行為(除了標記命令行)所以這是一個很好的更改,因為您支持兩種不同的環境。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.