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

2024-10-03 11:24:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

python do_work.py foo bar

我想让我的Rails用户按下一个按钮,然后让它发生在他们身上,结果要么上传到某个地方,要么作为下载链接或者类似的东西扔给他们——输出do_work.py(比如,它是result.txt

我还想澄清的是,脚本导致在文件系统上创建了3个独立的文件,它们不是文本文件(这不重要,在这里也不是真正的问题)

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

我的系统上安装了Python,但是sockmank提供的答案似乎不起作用——它返回nil。注意,像ls这样的其他命令似乎可以工作。

可能是权限问题吗?

def index
    value = %x( python --version )
    render :text => value
end

顺便说一下,在irb中尝试:

%x(python)

打开irb内部的Python终端。不管出于什么原因,它都不会接受params。


Tags: 文件用户py程序foovalue链接地方
3条回答

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

value = %x(python --version 2>&1)

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

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

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

请注意,脚本需要一些时间才能运行,因此调用可能会重叠。我会在这里排队以防发生这种情况。

别忘了检查用户输入的数据。千万不要直接传给剧本。

这在一定程度上取决于数据的格式。如果它不太长,并且可以直接在浏览器中呈现,则可以在rails控制器中执行以下操作:

result = `python do_work.py foo bar`
render :text => result

假设结果是纯ASCII文本,结果将直接进入浏览器。如果要执行的params.py来自用户,那么您必须首先验证它们,这样您就不会为自己创建一个令人讨厌的漏洞。在这种情况下,使用system()调用可能更安全。

如果您想将结果作为文件发送回来,可以查看ruby的Tempfile类来创建文件(以一种不会永远保留的方式),以及rails的send_file和send_data命令,这些命令用于一些不同的选项,以这种方式发送回结果。

utapyngo的答案几乎涵盖了你需要知道的所有信息。我来回答这个问题:

incidentally, trying this in irb: %x(python) Brings up the python terminal INSIDE of irb. It will not take params for whatever reason however.

要向python脚本传递参数,只需传递它。示例:

[fotanus@thing ~]$ python a.py 
args:
['a.py']
[fotanus@thing ~]$ irb
1.8.7 :001 > %x(python a.py foo bar)
 => "args:\n['a.py', 'foo', 'bar']\n" 

这适用于Ruby1.8、1.9和2.0。

相关问题 更多 >