Исполняемый файл Pyinstaller не запускает процессы, когда скрыт - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь запустить однофайловый исполняемый файл python, упакованный с PyInstaller. Скрипт содержит системные команды, которые необходимо выполнить. Однако, когда я пытаюсь запустить их (на окнах), они не выполняются. Дело в том, что они не выполняются только при использовании параметра PyInstaller no-console, который скрывает консоль и запускает ее в фоновом режиме.

Я использую следующие опции: --noconsole и -F.

Я не только попробовал функцию subprocess.open, но также os.popen(), оба из которых не работают.

Кроме того, мне нужен вывод на консоль, поэтому os.system() не будет вариантом ... пожалуйста, ответьте с учетом этого. Хотя эта функция действительно выполняла команды, поэтому я думаю, что получение вывода является проблемой. Я предполагаю, что мне нужно изменить стандартный вывод или что-то, или, может быть, если команда выполняется без консоли, вывод теряется или никогда не генерируется в первую очередь. Извините, если я звучу неопытным.

У меня нет антивирусного программного обеспечения, работающего на моем компьютере, и нет сообщения Защитника Windows и т. Д. Я понимаю, что это ненадежная комбинация - выполнение системных команд, пока они скрыты, - я только хочу создать не злонамеренную программу, которая каждую минуту убивает другую программу. Извините, если что-то осталось неясным ... просто спросите, если что-то неясно. Спасибо:)

EDIT

Вот некоторый код, чтобы помочь

command = data['command']
command_split = command.split(" ")

p = subprocess.Popen(command_split, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
result = out.decode() if out else err.decode()


io.emit("client:console_output", {
    'output':result,
    'adminID':data['adminID']
})

РЕДАКТИРОВАТЬ 2

Поймите, что эта функция работает, когда консоль не скрыта; следовательно, это не имеет ничего общего с логикой или кодом, а только потому, что оно скрыто. В любом случае, это вывод.

x = "taskkill /im chrome.exe /f"
print(x.split(" "))
-> ['taskkill', '/im', 'chrome.exe', '/f']

1 Ответ

2 голосов
/ 13 июля 2019

Вам нужно использовать subprocess.PIPE, чтобы перенаправить вывод процесса в переменную. Вам также нужно обработать подпроцесс stdin и закрыть его вручную. Затем вы можете просто отключить консоль с флагом -w или --noconsole.

import subprocess
p = subprocess.Popen(["ipconfig"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
out, err = p.communicate()
p.stdin.close()
result = out.decode() if out else err.decode()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...