pyscreenshot, поскольку ImageGrab не работает после компиляции с PyInstaller в exe
Когда я обычно использую код перед компиляцией, он работает отлично, но при компиляции в .exe с помощью cxfreeze или pyinstaller и запуске программного обеспечения зависает
import pyscreenshot as ImageGrab
import threading
def wprint():
print("Wprint")
global tempimg
imagem = ImageGrab.grab()
tempimg = imagem
print("End Wprint")
x = threading.Thread(target=wprint)
x.start()
1 ответ
Если мы включим ведение журнала, мы увидим, что модуль работает, порождая процесс для запуска PIL в
DEBUG:pyscreenshot.loader:running "pil" in child process
DEBUG:easyprocess:command: ['C:\\Users\\user\\.virtualenvs\\random\\Scripts\\python.exe', '-m', 'pyscreenshot.cli.grab', '--filename', 'C:\\Users\\user\\AppData\\Local\\Temp\\pyscreenshotbza0zwqm\\screenshot.png', '--backend', 'pil', '--debug']
DEBUG:easyprocess:process was started (pid=29996)
Wprint
DEBUG:easyprocess:process has ended, return code=0
DEBUG:easyprocess:stdout=
DEBUG:easyprocess:stderr=
DEBUG:PIL.PngImagePlugin:STREAM b'IHDR' 16 13
DEBUG:PIL.PngImagePlugin:STREAM b'IDAT' 41 65536
End Wprint
Когда вы упаковываете свое приложение, оно попытается запустить новый процесс против сгенерированного вами exe-файла в качестве интерпретатора (первый аргумент выше), но ваш скрипт ничего не обрабатывает из аргументов, поэтому он просто запускается снова, что порождает другой процесса, и это будет повторяться до тех пор, пока ваши ресурсы не будут исчерпаны или пока вы не завершите его.
На домашней странице pypi пакета pyscreenshot упоминается, что он в основном устарел, поскольку PIL (подушка) теперь правильно обрабатывает то, что он пытался решить изначально, и кажется, что это не было необходимо на вашей платформе. Таким образом, вы также можете попробовать ImageGrab подушки напрямую, который должен иметь нормальный API Python.
Модуль pyscreenshot в большинстве случаев устарел. Он был создан потому, что модуль PIL ImageGrab работал только в Windows, но теперь также поддерживаются Linux и macOS. В pyscreenshot есть некоторые функции, которые могут быть полезны в особых случаях: гибкие бэкенды, поддержка Wayland, иногда более высокая производительность, необязательная подобработка.