Python导入和文件嵌入

2024-05-19 17:07:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个导入多个包的项目,当脚本运行时,我加载一个神经网络模型。你知道吗

我想知道是否可以实现以下目标:

  1. 如果我在另一个python环境中运行这个脚本,我需要安装我导入的所有包。有可能避免这种情况吗?这将消除第一次安装所有软件包的需要。你知道吗
  2. 是否可以将neuralnet.pb嵌入到代码中?请记住,它重80mb,所以十六进制转储不起作用(带有转储的文本文件重700MB)

我们的想法是在1.py中包含所有必要的内容。有可能吗?你知道吗

谢谢你!你知道吗


Tags: 项目代码py模型脚本内容目标情况
1条回答
网友
1楼 · 发布于 2024-05-19 17:07:42

If i run the script in another python environment, i need to install all the packages im importing. Is it possible to avoid this?

嗯,不是真的,但有点像(TL;DR no,但取决于你的确切意思)。它实际上就是环境的限制。在某个地方,某个地方,你需要的软件包,你可以从磁盘抓取它们-就这么简单。它们必须可用可定位。你知道吗

可用的意思是通过文件系统访问。我所说的定位,是指你要找的地方。系统安装将把它放在可以访问的地方,并且可以可靠地用作安装和查找包的地方。这是虚拟环境的一部分责任。唯一的区别是,您的虚拟环境将您从系统Python的包中分离出来。你知道吗

这样做的好处很简单:我可以创建一个使用包slamjam==1.2.3的虚拟环境,其中1.2.3是包slamjam的特定版本,还可以运行一个使用slamjam==1.7.9的程序,而不会在我的全局环境中引起冲突。你知道吗

所以我给你一种“有点”的感觉:如果你的用户已经在你的系统上安装了一个包,那么你的用户不需要安装任何东西。如果软件包已经在他们的系统上进行了全局安装,他们就不需要虚拟环境。同样地,如果在另一个虚拟环境中,他们也不需要一个新的,尽管用一个新的虚拟环境来分离项目的依赖关系是一个好主意。你知道吗

Is it possible to embed the neuralnet .pb into the code? Keep in mind that it weighs 80mb, so an hex dump doesnt work (text file with the dump weighs 700 mb)

所以,是的,实际上这是非常可行的。问题是,这取决于你的意思。你知道吗

如您所知,文件的十六进制转储占用大量空间。这是真的。但似乎你说的是原始十六进制,每个字节至少需要2个字节。然后,如果您使用hexdump,yada,yada这样的工具,您可能会用它来转储额外的信息。你知道吗

故事的寓意是,你这样做会浪费大量的空间。所以我给你几个选择,你可以选择一个,或者更多。你知道吗

  1. 如果可能的话,压缩你的数据,甚至更多。你知道吗

我还没有使用过TensorFlow数据,但是快速阅读之后,它似乎使用了ProtoBufs压缩,而且可能已经相当压缩了。好吧,不管怎样,去看看你能不能从水果里挤出更多的果汁。你知道吗

  1. 获取二进制数据,并将其转储到不同的编码中(提示,提示:base64!)你知道吗

看看当我们把东西转换成十六进制时会发生什么。。。你知道吗

>>> binary_data=b'this is a readable string, but really it just boils down to binary information. i can be expressed in a more efficient way than a binary string or hex, however'
>>> hex_data = binary_data.hex()
>>> print(hex_data)
746869732069732061207265616461626c6520737472696e672c20627574207265616c6c79206974206a75737420626f696c7320646f776e20746f2062696e61727920696e666f726d6174696f6e2e20692063616e2062652065787072657373656420696e2061206d6f726520656666696369656e7420776179207468616e20612062696e61727920737472696e67206f72206865782c20686f7765766572
>>> print(len(hex_data))
318

318个字符?我们可以做得更好。你知道吗

>>> import base64
>>> hex_data = binary_data.hex()
>>> import base64
>>> b64_data = base64.b64encode(binary_data)
>>> print(b64_data)
b'dGhpcyBpcyBhIHJlYWRhYmxlIHN0cmluZywgYnV0IHJlYWxseSBpdCBqdXN0IGJvaWxzIGRvd24gdG8gYmluYXJ5IGluZm9ybWF0aW9uLiBpIGNhbiBiZSBleHByZXNzZWQgaW4gYSBtb3JlIGVmZmljaWVudCB3YXkgdGhhbiBhIGJpbmFyeSBzdHJpbmcgb3IgaGV4LCBob3dldmVy'
>>> print(len(b64_data))
212

你现在把你的数据缩小了33%!你知道吗

  1. .whl发行版打包一个非Python文件。是的,完全可行。我以前做过吗?不,还不需要。我会永远吗?是的。我对怎么做有很好的建议吗?没有。但是我有一个链接给你,it's totally doable.

  2. 您可以从应用程序中的下载文件,并且只提供URL。简单快捷的东西,如

import wget

file_contents_in_memory = wget.download('some.site.com/a_file`)

是的,当然还有像requests这样的库可以做类似的事情,但是举个例子,我选择了wget,因为它也有一个简单的接口,而且总是一个选项。你知道吗

The idea is to have 1 .py with everything necessary within. Is it possible?

嗯,档案,是的。你要问的是一个.py文件,没有其他可以安装你的软件包的文件?如果你真的想复制粘贴一个又一个的库,把所有的数据都复制到一个大文件里,没有人会下载,我相信有办法的。你知道吗

让我们看看一种更受支持的方法来解决您的问题:a ^{} file是一个文件,它可以有一个安装.whl所需的软件包的内部列表,它将为您处理所有事情(安装、解包等)。我会朝那个方向看。你知道吗

不管怎么说,我知道很多信息,但有一些逻辑,为什么你可以或不能做一些事情。希望对你有帮助,祝你好运。你知道吗

相关问题 更多 >