首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为Python中使用的bash脚本编码

问为Python中使用的bash脚本编码
EN

Software Engineering用户
提问于 2013-08-08 07:52:32
回答 1查看 7.4K关注 0票数 1

我正在用Python编写一些代码,在轮询服务器后检查许可证密钥的有效性。如果它是有效的,那么Python程序依次运行一些bash脚本。

如何创建python脚本(检查许可)和bash脚本(执行任务)的组合二进制文件?

以下是我认为可以解决的办法,但我真的不确定:

  1. 我在python中使用了encode函数,并对bash脚本文件进行了一次编码,并将该文件和license_checker.py文件添加到一个二进制文件中。当二进制文件运行时,python代码应该将文件解码为临时文件,运行脚本并删除临时文件。
  2. 找到一种将bash代码封装/嵌入到python脚本中的机制。我听说过装潢师,但我没有用过,也不知道他们是否能达到目的。
EN

回答 1

Software Engineering用户

回答已采纳

发布于 2013-08-08 09:13:20

我会使用第一个选项:将bash脚本嵌入到Python脚本中的多行字符串中,然后写出该脚本并使用subprocess模块运行脚本:

代码语言:javascript
复制
import tempfile
import subprocess

script_one = '''\
echo "Hello world!"
echo "This is a bash script. :-)"
'''

def run_script(script):
    with tempfile.NamedTemporaryFile() as scriptfile:
        scriptfile.write(script)
        scriptfile.flush()
        subprocess.call(['/bin/bash', scriptfile.name])

run_script(script_one)

run_script()函数接受bash脚本源,将其写入临时文件,执行它,并在完成时自动清理临时文件。

演示:

代码语言:javascript
复制
$ python /tmp/scripttest.py 
Hello world!
This is a bash script. :-)

Python装饰器在这里没有帮助;查看这些没有意义;装饰器只是用来包装其他Python函数的Python函数。

如果脚本很大,您可以尝试用zlib压缩它,base64对它进行编码,然后将它嵌入到Python文件中;使用.decode('base64')并将结果传递给zlib模块,首先给出一个解压字符串。ZLIB压缩减少了大小,但导致二进制数据,总是有点难以嵌入,而不必处理适当的转义和行长度。Base64编码再次将二进制数据转换为多行的ASCII安全数据,尽管代价是多25%的字节:

代码语言:javascript
复制
>>> import zlib
>>> zlib.compress(script_one).encode('base64')
'eJxLTc7IV1DySM3JyVcozy/KSVFU4koFi4VkZBYrAFGiQlJicYZCcXJRZkGJnoKVrqYSFwDnexDe\n'
>>> print """script_one = '''\\\n{}'''""".format(_)
script_one = '''\
eJxLTc7IV1DySM3JyVcozy/KSVFU4koFi4VkZBYrAFGiQlJicYZCcXJRZkGJnoKVrqYSFwDnexDe
'''

请注意,对于这个简短的脚本示例,这会将大小从54个字符增加到77个字符,但是对于较长的脚本,您应该会看到相当大的缩小。

解压缩就像zlib.decompress(script_one.decode('base64'))一样简单

票数 5
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/207613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档