Подпроцесс Python возвращает ненулевое состояние выхода 1. Минимальная рабочая выборка - PullRequest
0 голосов
/ 23 января 2019

Почему это не работает при работе от имени администратора?

import subprocess

command = "wbadmin get versions"
output = subprocess.check_output(["powershell", command], timeout=120)
print(output)

Когда я запускаю его из powershell или cmd, он работает.

Когда я использую Popen и общаюсь (), я получаю ошибку:

"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'

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Используйте полный путь в вашей команде. Например:

ps_args = "/etc/bin/wbadmin get versions" 
0 голосов
/ 24 января 2019

Ошибки, о которых идет речь, комментарии, как правило, указывают на тот факт, что есть большой шанс , что размещенный здесь код не тот, который вы запускаете (может быть, он устарел?).

В любом случае, выполнение вашего точного кода (сохраненного в файле с именем 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]: подпроцесс - Управление подпроцессом .
Итак, я изменил ваш код.

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 ) попытка запуска была успешно выполнена , но сама команда не удалась, Итак, все хорошо на стороне подпроцесса Python ) (факт, который не совсем понятен при использовании check_output ), и проблема в PS сторона.

В моем случае у меня нет резервных копий, поэтому ожидается сбой. Но в любом случае отсюда это больше похоже на задачу системного администратора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...