在python脚本中嵌入pickle(或任意)数据

时间:2009-12-11 13:09:26

标签: python embed

在Perl中,解释器在遇到带

的行时会停止
__END__

在里面。这通常用于在perl脚本的末尾嵌入任意数据。通过这种方式,perl脚本可以获取并存储它本身存储的数据,这可以提供非常好的机会。

在我的情况下,我有一个腌制的物品,我想存放在某个地方。虽然我可以使用file.pickle文件,但我正在寻找一种更紧凑的方法(更容易分发脚本)。

是否有一种机制允许以某种方式在python脚本中嵌入任意数据?

4 个答案:

答案 0 :(得分:4)

使用pickle,您也可以直接使用字符串。

s = pickle.dumps(obj)
pickle.loads(s)

如果将其与“”“(三重引号字符串)结合使用,您可以轻松地将任何腌制数据存储在您的文件中。

答案 1 :(得分:3)

如果数据不是特别大(很多K),我只想.encode('base64')并将其包含在三引号字符串中,使用.decode('base64')来获取二进制数据,和pickle.loads()调用它。

答案 2 :(得分:2)

在Python中,您可以使用“”(三重引号字符串)在程序中嵌入大量文本数据。

但是,在你的情况下,不要在此浪费时间。

如果你有一个被腌制的对象,那么将这个对象作为Python源并将其简单地包含在源中会更加快乐。

应用于大多数对象的repr函数将发出该对象的Python源代码版本。如果为所有自定义类实现__repr__,则可以将结构简单地转储为Python源。

另一方面,如果您的pickle结构最初是Python代码,那么只需将其保留为Python代码即可。

答案 3 :(得分:1)

我制作了这段代码。你运行像python comp.py foofile.tar.gz之类的东西,它创建了decomp.py,其中嵌入了foofile.tar.gz的内容。因为Popen,我认为这不是真正的便携式窗户。

import base64
import sys
import subprocess

inf = open(sys.argv[1],"r+b").read()
outs = base64.b64encode(inf)

decomppy = '''#!/usr/bin/python
import base64

def decomp(data):
    fname = "%s"
    outf = open(fname,"w+b")
    outf.write(base64.b64decode(data))
    outf.close()

    # You can put the rest of your code here.
    #Like this, to unzip an archive
    #import subprocess
    #subprocess.Popen("tar xzf " + fname, shell=True)
    #subprocess.Popen("rm " + fname, shell=True)
''' %(sys.argv[1])

taildata = '''uudata = """%s"""
decomp(uudata)
''' %(outs)

outpy = open("decomp.py","w+b")
outpy.write(decomppy)
outpy.write(taildata)
outpy.close()
subprocess.Popen("chmod +x decomp.py",shell=True)