Запуск файла .exe, скомпилированного Pyinstaller, не может подавить окно консоли tsharkPython

Программы на Python
Anonymous
Запуск файла .exe, скомпилированного Pyinstaller, не может подавить окно консоли tshark

Сообщение Anonymous »

В моем проекте Python есть файл main.py, который является входом приложения и использует Tkinter для разработки пользовательского интерфейса. Есть еще несколько файлов .py, которые будут вызываться и запускаться из main.py. Один из файлов .py — этоprocess_pcap.py, который импортирует API Pyshark для вызова tshark для обработки журнала .pcap. Для удобства распространения приложения я использую Pyinstaller для преобразования файла main.py в main.exe.
Когда я запускаю main.exe, чтобы открыть пользовательский интерфейс приложения, а затем выбираю выполнение процесса_pcap ( через вызов класса PCAP, определенного в файлеprocess_pcap.py), появляется окно консоли «tshark». Это не то, чего я хочу. Я хочу, чтобы окно консоли tshark не появлялось.
Но когда я напрямую запускаю python main.py для выполнения процесса_pcap, окно консоли tshark не появляется.< /p>
Я пробовал несколько способов отключить окно консоли tshark, но ни один из них не работает.
  • Я пробовал команды ниже, чтобы преобразовать main.py в main.exe. Но он не смог скрыть окно консоли tshark.

Код: Выделить всё

pyinstaller --onefile --windowed main.py
pyinstaller --onefile --noconsole main.py
  • Я также пытался изменить subprocess.Popen и subprocess.check_output вprocess_pcap.py, но он не смог подавить консоль tshark. либо окно.

Код: Выделить всё

import pyshark
import subprocess
import sys

class PCAP:
def __init__(self, pcap_file, redirector_stdout):
self.pcap_file = pcap_file
self.redirector_stdout = redirector_stdout
self.suppress_console_window()

def suppress_console_window(self):
if sys.platform.startswith('win'):
# Save the original subprocess.Popen and subprocess.check_output
original_popen = subprocess.Popen
original_check_output = subprocess.check_output

# Define a new Popen that suppresses the console window
def new_popen(*args, **kwargs):
if 'startupinfo' not in kwargs:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
kwargs['startupinfo'] = startupinfo

# Add CREATE_NO_WINDOW as well for extra suppression
if 'creationflags' not in kwargs:
kwargs['creationflags'] = subprocess.CREATE_NO_WINDOW

kwargs['shell'] = True  # Ensure shell execution
return original_popen(*args, **kwargs)

# Define a new check_output that suppresses the console window
def new_check_output(*args, **kwargs):
if 'startupinfo' not in kwargs:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
kwargs['startupinfo'] = startupinfo

if 'creationflags' not in kwargs:
kwargs['creationflags'] = subprocess.CREATE_NO_WINDOW

kwargs['shell'] = True
return original_check_output(*args, **kwargs)

# Override subprocess.Popen and subprocess.check_output with the new versions
subprocess.Popen = new_popen
subprocess.check_output = new_check_output

def execute_code(self):
# Process the pcap file using Pyshark without showing the tshark console
cap = pyshark.FileCapture(self.pcap_file, display_filter='sip')

for packet in cap:
self.redirector_stdout.write(f"packet = {packet}\n")
if 'sip' in packet:
sip_layer = packet['sip']
self.redirector_stdout.write(f"sip_layer = {sip_layer}\n")

if __name__ == "__main__":
# Example usage when running this script directly
pcap = PCAP('sample.pcap', sys.stdout)
pcap.execute_code()
Как подавить окно консоли tshark в моем случае, описанном выше?

Подробнее здесь: https://stackoverflow.com/questions/790 ... onsole-win

Вернуться в «Python»