Пайтон скрипт неправильно работает после компиляции с помощью pyinstaller
from pynput import keyboard
import pyautogui
import sys
import time
from typing import Optional
from ctypes import wintypes, windll, create_unicode_buffer
def getForegroundWindowTitle() -> Optional[str]:
hWnd = windll.user32.GetForegroundWindow()
length = windll.user32.GetWindowTextLengthW(hWnd)
buf = create_unicode_buffer(length + 1)
windll.user32.GetWindowTextW(hWnd, buf, length + 1)
if buf.value:
return buf.value
else:
return None
def w():
print('w')
x, y = pyautogui.position()
if getForegroundWindowTitle() == 'game name':
try:
pyautogui.click(1050, 1010 , button='right')
time.sleep(0.05)
pyautogui.moveTo(x, y)
except:
pass
else:
print('окно с игрой неактивно!')
def t():
print('t')
x, y = pyautogui.position()
if getForegroundWindowTitle() == 'game name':
try:
pyautogui.click(1240, 1010, button='right')
time.sleep(0.05)
pyautogui.moveTo(x, y)
except:
pass
else:
print('окно с игрой неактивно!')
def on_key_release(key):
try:
if key.char == "w":
w()
elif key.char == "t":
t()
elif key.char == "p":
print('p')
listener.stop()
sys.exit()
else:
print('ошибка')
except:
print('!')
with keyboard.Listener(on_release = on_key_release) as listener:
listener.join()
Этот скрипт для игры идеально работает, когда я запускаю его в pycharm или через командную строку, но после того как я превращаю его в .exe файл с помощью pyinstaller, он начинает работать некорректно.
Функция скрипта - определять нажатие клавиш и на "релизе" заданных совершать манипуляции курсором, после запуска exe в консоль выводится "ошибка" при нажатии любой клавиши с буквой(блок try работает как и должен), при этом скрипт все ещё правильно определяет название окна игры и нажатую клавишу(проверено). В чем может быть проблема?
Ответы (2 шт):
Проверь, что PyInstaller включает все необходимые библиотеки. Можешь указать какие-то неявные из них в параметре --hidden-import
при сборке приложения.
from pynput import keyboard
import pyautogui
import sys
import time
from typing import Optional
from ctypes import wintypes, windll, create_unicode_buffer
Возможно, в этих импортах проблема. Если в интерактивном режиме работает, значит, имеет доступ ко всему, что нужно для работы. То есть, если даже чего забыли импортировать, среда "поможет". Pyinstaller не умеет читать мысли. Он собирает в кучу только то, на что есть ссылки в коде. Что-то не импортируется как должно. Ну и лично я вообще не понял из этого описания проблемы суть проблемы. Что не работает? Что пишет или не пишет программа в консоль в качестве ошибки? Что за версия pyautogui? Вот это: "определять нажатие клавиш и на "релизе" заданных совершать манипуляции курсором" - набор слов!