将二进制文件自动字符串编码为python变量
stringif的Python项目详细描述
目的
stringify模块允许您轻松地将项目的二进制文件包含为python base64字符串。在尝试使用pyinstaller将项目打包为可执行文件之前,这可能对您的小tkinter项目没有用处。突然之间,你会花很多时间思考如何最好地编写你的spec文件,以便它们能够捕获当前的文件以及将来的任何更改。或者可以使用stringify。
安装
只要pip install stringify就可以了。您还可以下载这个存储库和python setup.py install,但这并没有那么有趣,是吗?
用例
在某个地方-可能在您的模块中-您有一个包含静态、非代码数据的文件。您可能有一个名为images或bin的目录,python代码在构建gui或执行程序时会引用该目录…不管怎样。这在直接使用python时非常有用,比如通过pip安装包并从命令行调用它。当您尝试使用pyinstaller捆绑包时,这并不能很好地工作,因为pyinstaller无法识别您的非代码依赖项。
这个库允许您将这些二进制文件读入python代码,并将这些数据作为python变量包含在代码库中。
简而言之,这个库只在相对较小的文件(如图像)上测试过。使用此方法的较大文件打包尚未测试。
快速启动
我们将假设一个项目结构,开始如下所述。注意,图像路径是显式的 作为my_package/package_file_0.py的一部分调用。:
setup.py my_package/ __init__.py package_file_0.py images/ img1.png img2.png
流放二进制文件< EH3>
将二进制文件移出要包含在其中的包。我们会放些东西代替他们,但暂时不要担心。我们的新项目结构:
setup.py images/ img1.png img2.png my_package/ __init__.py package_file_0.py
运行stringify_py()utility
我们的文件现在位于images中,我们希望的位置是包中的images.py:
from stringify import stringify_py stringify_py(source_path='images', destination_file='my_package/images.py')
注意,破折号将替换为下划线,空格将替换为下划线,并且在创建python变量的名称之前,扩展将被删除。例如,green-dot one.png将成为变量green_dot_one。
早期的源树保持完整,但在{TT11} $中有一个额外的文件称为{{TT8} $:
setup.py images/ img1.png img2.png my_package/ __init__.py package_file_0.py images.py
请随意查看images.py,您不会伤害它,您可以随时重新生成它。您应该会看到位于名为img1和img2的两个变量。每一个都有一个分配给它的长字节字符串,可以很容易地引用和挖掘数据。
引用图像字符串
回想一下,使用图像数据的是package_file_0.py。在package_file_0.py中,导入新的图像字符串:
from images import img1, img2
用变量替换对这些图像的任何绝对函数调用。请注意,某些函数(如tkinter.PhotoImage())可以直接以这种格式获取图像数据。:
# tkinter.PhotoImage(file='./images/img1.png') # replace this call... tkinter.PhotoImage(data=img1) # with this one
根据您的用例,您可能需要试验解包数据以供使用的方法。
锁定它
为了减少以后弄糟这一点的可能性,您可能希望将此功能添加到工作流中,以便在开发和分发包时自动完成。只需在调用setup()之前,在my_package的setup.py脚本中包含stringify_py()。:
from setuptools import setup from stringify import stringify_py stringify_py(source_path='images', destination_file='my_package/images.py') setup( name='my_package', version=__version__, setup_requires=['stringify', 'flake8'] ...
如图所示,您可能还希望将stringify添加到setup_requires中,但如果未安装stringify,则在导入时会出现错误,因此跳过这一行不会破坏打包。
运行pyinstaller脚本
既然您的文件只是打包到您的应用程序中,那么您的包t应该没有什么特别的地方了帽子需要MANIFEST.in或干扰pyinstaller。
只要pyinstaller my_package/package_file_0.py(假设这就是你的切入点),你就可以开始摇滚了!
饮料
既然您没有花费所有的时间为您的项目编写客户pyinstaller脚本,那么您可以通过喝一杯来庆祝。享受吧!