Найти - Пользователи
Полная версия: Запуск внешнего приложения через Popen
Начало » Python для новичков » Запуск внешнего приложения через Popen
1
zigen
Доброго дня!

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

terabayt
я не уверен, так как с виндовсом давно не работал, но попробуйте так
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)
zigen
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)
JOHN_16
винды под рукой нет, поэтому просто посоветую почитать в моем блоге про Popen и поиграться с аргументом shell
doza_and
zigen
Такое ощущение, что пайтон каждый раз новый процесс инициализирует, а bat все через один гонит.
Если надо ждать завершения порожденного процесса то используйте subprocess.check_call
vanvanov
Попробуйте не subprocess.Popen, а subprocess.call.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB