将二进制文件自动字符串编码为python变量

stringif的Python项目详细描述


目的

stringify模块允许您轻松地将项目的二进制文件包含为python base64字符串。在尝试使用pyinstaller将项目打包为可执行文件之前,这可能对您的小tkinter项目没有用处。突然之间,你会花很多时间思考如何最好地编写你的spec文件,以便它们能够捕获当前的文件以及将来的任何更改。或者可以使用stringify。

安装

只要pip install stringify就可以了。您还可以下载这个存储库和python setup.py install,但这并没有那么有趣,是吗?

用例

在某个地方-可能在您的模块中-您有一个包含静态、非代码数据的文件。您可能有一个名为imagesbin的目录,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,您不会伤害它,您可以随时重新生成它。您应该会看到位于名为img1img2的两个变量。每一个都有一个分配给它的长字节字符串,可以很容易地引用和挖掘数据。

引用图像字符串

回想一下,使用图像数据的是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_packagesetup.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脚本,那么您可以通过喝一杯来庆祝。享受吧!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
构造函数的java条件调用   类Dog中的java构造函数Dog不能应用于给定类型   java jsch和运行“sudo su”   java将队列和堆栈相互复制   java如何在netbeans项目的文件夹中添加库   java While循环在我的代码中不存在   如何在XML中使用java方法的返回值   java是否可以在不写入文件的情况下将字符串/字节数组作为文件发布?   java为什么这些字符串不相等?   sockets客户机-服务器java编程,用户可选择   java如何在SpringMVC和hibernate中保存模型返回视图的列表   java如何修复组织。openqa。硒。WebDriverException:未知错误   Java,Ant错误:编码Cp1252的不可映射字符   JAVAlang.ClassCastException:[Ljava.lang.String;与java.lang.String不兼容   java如何使用JDK8(可选)为空字段创建自定义IntelliJ getter模板   java Tomcat6响应。sendRedirect()404错误