Я пытаюсь использовать subprocess.check_call()
и netsh, чтобы изменить настройки карты NIC на компьютере. В настоящее время используется python 2.7 и Windows7.Проблема с subprocess.check_call() return 1 with netsh
Эта команда успешна, когда я запускаю его в из cmd.exe:
netsh interface ip set address name="Local Area Connection" static 192.168.1.1 255.255.255.0 192.168.1.2
Этот питон скрипт не удается:
import subprocess
command = ['netsh','interface','ip','set','address','name="Local Area Connection"','static','192.168.1.1','255.255.255.0','192.168.1.2']
result = subprocess.check_call(command)
И это последняя строка вывода отладочные дал из сценария python выше:
CalledProcessError: Command '['netsh', 'interface', 'ip', 'set', 'address', 'name="Local Area Connection"', 'static', '192.168.1.1', '255.255.255.0', '192.168.1.2']' returned non-zero exit status 1
Итак, что-то явно не так, и я tr чтобы выяснить, что. Первое, что я хотел бы решить, это то, что означают коды возврата? Надеюсь, я не плотный, но https://python.readthedocs.org/en/v2.7.2/library/subprocess.html#, похоже, не объясняет, что означает код возврата. Я нашел эту ветку, What is the return value of subprocess.call()?, но она дает только общие заявления о кодах возврата вообще. Кто-нибудь знает, как определить значение кодов возврата, относящихся к subprocess.check_call()
?
Это поможет мне начать поиск неисправностей, но если у кого-нибудь есть идеи относительно того, почему сценарий терпит неудачу, это было бы весьма полезно. Я попытался использовать «Запуск от имени администратора», чтобы открыть cmd.exe, а затем запустить скрипт python, но результат тот же. Этот поток, похоже, является одной и той же проблемой, но я не вижу разрешения на это: Using subprocess.call() to pass commands to execute by cmd. Я пробовал установить command = netsh interface ip set address name="Local Area Connection" static 192.168.1.1 255.255.255.0 192.168.1.2
и subprocess.check_call(command,shell=True)
, а также subprocess.check_call(shlex.split(command))
, и оба кода возврата '1'.
Спасибо за ответ. До этого момента я знал о «обработке ошибок», но на самом деле не использовал его. Нужно начать для лучшей практики, так что приятно иметь повод для этого.К сожалению, в этом случае 'print (ex.returncode, ex.output)' дает выход '(1, None)' ....... не слишком полезно. Не запускает cmd.exe в качестве администратора, а затем выполняет скрипт python оттуда, чтобы ухаживать за администратором? Я делаю еще несколько исследований в этом, поэтому я могу быть уверенным, что я запускаю его как администратора. – jeby
Это очень странно. Это должно по крайней мере дать вам некоторую отдачу. Вы уверены, что вы изменили вызов с 'check_call()' на 'check_output()'? Кроме того, что касается вашей фактической проблемы, это могут быть цитаты вокруг 'name =" Local Area Connection ". Попробуйте просто «name = Подключение по локальной сети». – poke
@poke, кажется, ваша догадка правильная. 'subprocess.list2cmdline' избегает двойных кавычек как' "name = \" Подключение по локальной сети \ "" '. Таким образом, код запуска CRT в netsh.exe не удаляет их при создании массива 'argv'. Они обрабатываются как часть имени интерфейса. – eryksun