为什么以管理员身份运行时不起作用?
import subprocess
command = "wbadmin get versions"
output = subprocess.check_output(["powershell", command], timeout=120)
print(output)
当我从powershell或cmd运行它时,它会起作用。
当我使用Popen和communication()时,出现错误:
"wbadmin" is not a known name, function or script..."
The original message is in german:
b''
b'wbadmin : Die Benennung "wbadmin" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines \r\nausf\x81hrbaren Programms erkannt. \x9aberpr\x81fen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern \r\nenthalten), und wiederholen Sie den Vorgang.\r\nIn Zeile:1 Zeichen:1\r\n+ wbadmin get versions\r\n+ ~~~~~~~\r\n + CategoryInfo : ObjectNotFound: (wbadmin:String) [], CommandNotFoundException\r\n + FullyQualifiedErrorId : CommandNotFoundException\r\n \r\n'
答案 0 :(得分:0)
有问题的错误和评论倾向于指出一个事实,即这里发布的代码不是您运行的代码的可能性很大(很可能是过时的?)。 >
无论如何,运行您的精确代码(保存在名为 code.py 的文件中)会产生:
e:\Work\Dev\StackOverflow\q054334592>"e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code.py Traceback (most recent call last): File "code.py", line 4, in <module> output = subprocess.check_output(["powershell", command], timeout=120) File "c:\Install\x64\Python\Python\03.06.08\Lib\subprocess.py", line 356, in check_output **kwargs).stdout File "c:\Install\x64\Python\Python\03.06.08\Lib\subprocess.py", line 438, in run output=stdout, stderr=stderr) subprocess.CalledProcessError: Command '['powershell', 'wbadmin get versions']' returned non-zero exit status 1.
没有太多有用的信息。
但是 check_output 只是一个方便包装,在当前情况下对我们不利。有关更多详细信息,请检查[Python 3]: subprocess - Subprocess management。
所以,我修改了您的代码。
code.py :
import subprocess
ps_args = "wbadmin get versions"
cmd = ["powershell", *ps_args.split(" ")] # It works with your way too (["powershell", ps_args]), I'm just being rigorous
print("Popen arguments: {:}".format(cmd))
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate(timeout=120)
print("\nProcess terminated with exit code: {:}".format(proc.returncode))
print("\nSTDOUT:\n{:}\n".format(out.decode()))
print("STDERR:\n{:}\n".format(err.decode()))
这次,输出为:
e:\Work\Dev\StackOverflow\q054334592>"e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code.py Popen arguments: ['powershell', 'wbadmin', 'get', 'versions'] Process terminated with exit code: 1 STDOUT: wbadmin 1.0 - Backup command-line tool (C) Copyright Microsoft Corporation. All rights reserved. ERROR - No backup was found. STDERR:
现在,可以看到 PS ( powershell )命令运行尝试已成功运行,但是该命令本身失败了。因此,在 subprocess (和 Python )方面,一切都很好(事实在使用 check_output 时并不清楚),问题是在 PS 一侧。
就我而言,我没有备份,因此预期会失败。但是无论如何,从这里开始,这似乎更像是一个sysadmin任务。
答案 1 :(得分:0)
在命令中使用完整路径。例如:
ps_args = "/etc/bin/wbadmin get versions"