Форум сайта python.su
0
Доброго дня!
Есть задача: из каталога выбирать все сертификаты *.cer и инсталить их в локалмашин стор.
Для этого использую Micrisoft's утилиту certmgr.exe.
Если это делать через bat файл
certmgr -add -c root2.crt -s -r localMachine CA
certmgr -add -c root3.crt -s -r localMachine CA
certmgr -add -c root4.crt -s -r localMachine CA
например то все ок. Появляется окошко в который воводится весь лог.
А если запускаю через пайтон скрипт то окошек рождается количество равно количеству сертификатов в каталоге.
Такое ощущение, что пайтон каждый раз новый процесс инициализирует, а bat все через один гонит.
def install_certs(ext): list_certs = [fname for fname in os.listdir('.') if (os.path.splitext(fname))[-1] == ext ] for cert in list_certs: proc = subprocess.Popen(['certmgr.exe', '-add', '-c', '%s'% cert, '-s', '-r', 'localMachine', 'CA'] ,shell=False, stdout=subprocess.PIPE) out = proc.communicate() os.remove(cert)
Офлайн
103
я не уверен, так как с виндовсом давно не работал, но попробуйте так
def install_certs(ext): list_certs = [fname for fname in os.listdir('.') if (os.path.splitext(fname))[-1] == ext ] s = "" for cert in list_certs: s += 'certmgr.exe -add -c ' + cert + ' -s -r localMachine CA & ' proc = subprocess.Popen([s[:-2]] ,shell=True, stdout=subprocess.PIPE)
Отредактировано terabayt (Окт. 29, 2014 21:55:27)
Офлайн
0
terabayt
я не уверен, так как с виндовсом давно не работал, но попробуйте так
def install_certs(ext): list_certs = [fname for fname in os.listdir('.') if (os.path.splitext(fname))[-1] == ext ] with open ('install.bat','a') as install: for cert in list_certs: install.write('certmgr -add -c '+ cert + ' -s -r localMachine CA ' + '\n') proc = subprocess.Popen('install.bat') proc.wait() os.remove('install.bat') for cer in list_certs: os.remove(cer)
Отредактировано zigen (Окт. 30, 2014 09:45:42)
Офлайн
221
винды под рукой нет, поэтому просто посоветую почитать в моем блоге про Popen и поиграться с аргументом shell
Офлайн
253
zigenЕсли надо ждать завершения порожденного процесса то используйте subprocess.check_call
Такое ощущение, что пайтон каждый раз новый процесс инициализирует, а bat все через один гонит.
Офлайн
4
Попробуйте не subprocess.Popen, а subprocess.call.
Офлайн