如何将独立的Python脚本集成到Rails应用程序中?

dsp*_*099 30 ruby python rake ruby-on-rails heroku

我有一个程序,它有一个小的文件结构,然后运行使用

python do_work.py foo bar
Run Code Online (Sandbox Code Playgroud)

我希望我的Rails用户按下按钮并为他们发生这种情况,结果要么上传到某个地方,要么只是作为下载链接或类似的东西抛出 - 输出do_work.py(比方说,它result.txt)

我还想澄清一下,脚本会在文件系统上创建3个独立的文件,这些文件不是文本文件(这应该不重要,这里不是问题)

最好的方法是什么?可以rake运行exec Python吗?更重要的是,这在heroku上是可行的吗?

我在我的系统上安装了Python,但sockmonk提供的答案似乎不起作用 - 它返回nil.请注意,其他命令ls似乎有效.

这可能是权限问题吗?

def index
    value = %x( python --version )
    render :text => value
end
Run Code Online (Sandbox Code Playgroud)

顺便说一句,尝试这个irb:

%x(python)
Run Code Online (Sandbox Code Playgroud)

打开irb的Python终端INSIDE.然而,无论出于何种原因,它都不会占用.

uta*_*ngo 26

您的index方法不起作用,因为python --version它的版本输出到STDERR,而不是STDOUT.如果您不需要分离这些流,您可以将STDERR重定向到STDOUT:

value = %x(python --version 2>&1)
Run Code Online (Sandbox Code Playgroud)

此调用是同步的,因此在运行script(python do_work.py foo bar 2>&1)之后,您应该能够读取它生成的文件.

如果脚本由于某种原因无法创建文件,您现在将在value变量中看到异常,因为错误消息通常会发送到STDERR.

如果要将STDERR与STDOUT分开,请使用Open3模块.

请注意脚本需要一些时间才能运行,因此调用可能会重叠.我会在这里使用一个队列来防止这种情况.

并且不要忘记检查用户输入的数据.永远不要将它直接传递给脚本.