Проблема в том, что вы эффективно предоставляете Setup.exe только один аргумент. Не думайте с точки зрения оболочки: строка, которую вы передаете в качестве аргумента, больше не разделяется на пробелы, это ваша обязанность!
Итак, если вы абсолютно уверены, что "/ qn / lv% TEMP% \ log_silent.log" должен быть одним аргументом, используйте это:
subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s', '/v', '/qn /lv %TEMP%\log_silent.log'],stdout=subprocess.PIPE).communicate()[0]
В противном случае (я думаю, это будет правильно), используйте это:
subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s', '/v', '/qn', '/lv', '%TEMP%\log_silent.log'],stdout=subprocess.PIPE).communicate()[0]