Использование подпроцесса Python для изменения настроек сервера ntp в Windows

Итак, я пытаюсь изменить настройки сервера ntp в Windows (XP и 7), используя следующее:

import subprocess
subprocess.call(['net', 'stop', 'w32time'])
subprocess.call(['reg', 'add','HKLM\Software\Microsoft\Windows\CurrentVersion\DateTime\Servers', '/f /v \"0\" /t REG_SZ /d \"ntp.craven.k12.nc.us\"'])
subprocess.call(['reg', 'add', 'HKLM\Software\Microsoft\Windows\CurrentVersion\DateTime\Servers', '/f /v \"(Default)\" /t REG_SZ /d \"0\"'])
subprocess.call(['net', 'start', 'w32time'])
subprocess.call(['w32tm', '/resync'])

Но это с треском проваливается. Я уверен, что проблема заключается в том, как я форматирую параметры, но я еще не придумал, как это сделать правильно.


person davelupt    schedule 10.03.2014    source источник
comment
Да, первая и последняя две команды работают так, как я и ожидал, именно те, которые редактируют реестр, оказались сложными.   -  person davelupt    schedule 10.03.2014
comment
не связано: вам не нужно subprocess для редактирования реестра, см. winreg   -  person jfs    schedule 10.03.2014
comment
Вам нужно экранировать символ '\' или использовать необработанные строки, например, 'HKLM\\Software\\Microsoft\\...' или r'HKLM\Software\Microsoft\...'   -  person tdelaney    schedule 10.03.2014
comment
@ J.F.Sebastian Я прихожу к выводу, что есть веская причина для включения winreg в версию 3, но я ограничен использованием 2.7. Я заметил, что если я выполню subprocess.call с reg-запросом, он даст другой ответ, чем если бы я запускал его напрямую. Есть идеи, почему?   -  person davelupt    schedule 11.03.2014
comment
winreg называется _winreg в Python 2   -  person jfs    schedule 11.03.2014
comment
Предоставьте полные команды и их результаты (возможно, как новый вопрос). Мое предположение: команды разные или они не идемпотентные   -  person jfs    schedule 11.03.2014
comment
Большое спасибо @J.F.Sebastian, я понял, что запускаю 32-битный Python на 64-битной машине, поэтому мои результаты были с Wow6432Node. Удалось исправить это с помощью: stackoverflow.com/questions/11808462 /   -  person davelupt    schedule 11.03.2014


Ответы (1)


Ваши последние аргументы не разделены. Вероятно, вам нужно заменить '/f /v \"0\" /t REG_SZ ...' на ] + ['/f', '/v', '0', '/t', 'REG_SZ'] + [...].

В качестве альтернативы можно передать всю команду в виде строки (как в командной строке).

person jfs    schedule 10.03.2014