如何在执行期间将python解释器保留在内存中?

时间:2016-10-29 10:16:16

标签: python

我需要在python中重复调用短程序。

由于程序很简单,但是使用多个(标准)模块和目标硬件(嵌入式ARM9运行linux)并不是非常强大,解释器+ libs的加载时间大大超过了prog运行时。

有没有办法让python解释器保留在内存中,“只是”为它提供一个程序来执行?

我知道我可以编写一个相当简单的“C”包装器来生成解释器,然后通过PyRun_SimpleFile()将它提供给我的程序,但这看起来像是一种过度杀伤力。当然有一些更简单(也可能更“pythonic”)的方法来实现同样的目标。

1 个答案:

答案 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}}