我有一个小文件结构的程序,然后用
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。
您的
index
方法无法工作,因为python --version
将其版本输出到STDERR,而不是STDOUT。如果不需要分离这些流,可以将STDERR重定向到STDOUT:此调用是同步的,因此在运行脚本(
python do_work.py foo bar 2>&1
)之后,您应该能够读取它生成的文件。如果脚本由于某种原因无法创建文件,您现在将在
value
变量中看到异常,因为错误消息通常发送到STDERR。如果要将STDERR与STDOUT分开,请使用Open3模块。
请注意,脚本需要一些时间才能运行,因此调用可能会重叠。我会在这里排队以防发生这种情况。
别忘了检查用户输入的数据。千万不要直接传给剧本。
这在一定程度上取决于数据的格式。如果它不太长,并且可以直接在浏览器中呈现,则可以在rails控制器中执行以下操作:
假设结果是纯ASCII文本,结果将直接进入浏览器。如果要执行的params.py来自用户,那么您必须首先验证它们,这样您就不会为自己创建一个令人讨厌的漏洞。在这种情况下,使用system()调用可能更安全。
如果您想将结果作为文件发送回来,可以查看ruby的Tempfile类来创建文件(以一种不会永远保留的方式),以及rails的send_file和send_data命令,这些命令用于一些不同的选项,以这种方式发送回结果。
utapyngo的答案几乎涵盖了你需要知道的所有信息。我来回答这个问题:
要向python脚本传递参数,只需传递它。示例:
这适用于Ruby1.8、1.9和2.0。
相关问题 更多 >
编程相关推荐