我需要在python中重复调用短程序。
由于程序很简单,但是使用多个(标准)模块和目标硬件(嵌入式ARM9运行linux)并不是非常强大,解释器+ libs的加载时间大大超过了prog运行时。
有没有办法让python解释器保留在内存中,“只是”为它提供一个程序来执行?
我知道我可以编写一个相当简单的“C”包装器来生成解释器,然后通过PyRun_SimpleFile()将它提供给我的程序,但这看起来像是一种过度杀伤力。当然有一些更简单(也可能更“pythonic”)的方法来实现同样的目标。
答案 0 :(得分:0)
解决这个问题的方法可能很多。
一个简单的方法是将所有短程序组合成一个简单的Web应用程序,可能是一个侦听本地Unix套接字而不是网络套接字的应用程序。例如,使用flask quickstart中的最小Flask应用程序:
myapp.py
您可以在这样的本地Unix套接字上公开它,假设您已将上述代码放入名为uwsgi --http-socket /tmp/app.sock --manage-script-name --plugin python --mount /=myapp:app
的脚本中:
/
现在您可以像这样访问它(请注意http:/
中的单个$ curl --unix-socket /tmp/app.sock http:/
Hello, world!
;这是因为我们在连接到本地套接字时不需要主机名):
@app.route('/cmd1', methods=['POST'])
def cmd1():
inputfile = request.form.get('inputfile')
with open(inputfile) as fd:
output = fd.read().replace('Hello', 'Goodbye')
return output
这将允许您启动Python脚本一次并让它持久运行,从而避免与后续调用的启动和模块加载相关的成本,同时为您提供运行不同功能,提供输入参数等的方法。
这是一个将文件名作为输入并对文件执行一些转换的示例:
$ cat data
Hello world
假设我们有:
$ curl --unix-socket /tmp/app.sock http:/cmd1 -d inputfile=$PWD/data
Goodbye world
我们可以致电:
{{1}}