当我在编译前正常使用代码时,它可以完美地工作,但当使用cxfreeze或pyinstaller编译到.exe并运行软件时,会冻结
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()
如果我们打开日志记录,我们可以看到该模块通过生成一个进程来在中运行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作为解释器运行新进程(上面的第一个参数(,但你的脚本不处理参数中的任何内容,所以它只是重新启动,这会产生另一个进程,这种情况会重复,直到你的资源耗尽或终止它。
pyscreen包的pypi主页提到,它基本上已经过时了,因为PIL(pillow(现在可以正确地处理它最初试图解决的问题,而且在您的平台上似乎没有必要这样做。所以你也可以直接尝试一下pillow的ImageGrab,它应该有一个普通的Python API。
pyscreenscaption模块在大多数情况下都已过时。它的创建是因为PIL ImageGrab模块只在Windows上工作,但现在Linux和macOS也受支持。pyscreen中有一些功能在特殊情况下很有用:灵活的后端、Wayland支持、有时更好的性能、可选的子处理。