Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 29, 2014 16:28:22

zigen
Зарегистрирован: 2014-08-13
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск внешнего приложения через Popen

Доброго дня!

Есть задача: из каталога выбирать все сертификаты *.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)

Офлайн

#2 Окт. 29, 2014 21:53:25

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Запуск внешнего приложения через Popen

я не уверен, так как с виндовсом давно не работал, но попробуйте так

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)



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Окт. 29, 2014 21:55:27)

Офлайн

#3 Окт. 30, 2014 07:41:59

zigen
Зарегистрирован: 2014-08-13
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск внешнего приложения через Popen

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)

Офлайн

#4 Окт. 30, 2014 11:06:07

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Запуск внешнего приложения через Popen

винды под рукой нет, поэтому просто посоветую почитать в моем блоге про Popen и поиграться с аргументом shell



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Окт. 30, 2014 19:18:52

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Запуск внешнего приложения через Popen

zigen
Такое ощущение, что пайтон каждый раз новый процесс инициализирует, а bat все через один гонит.
Если надо ждать завершения порожденного процесса то используйте subprocess.check_call



Офлайн

#6 Окт. 31, 2014 11:31:09

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Запуск внешнего приложения через Popen

Попробуйте не subprocess.Popen, а subprocess.call.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version