在Perl中,解释器在遇到带
的行时会停止__END__
在里面。这通常用于在perl脚本的末尾嵌入任意数据。通过这种方式,perl脚本可以获取并存储它本身存储的数据,这可以提供非常好的机会。
在我的情况下,我有一个腌制的物品,我想存放在某个地方。虽然我可以使用file.pickle文件,但我正在寻找一种更紧凑的方法(更容易分发脚本)。
是否有一种机制允许以某种方式在python脚本中嵌入任意数据?
答案 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)