在Python脚本中调用Rails 4参数
我试图在Python脚本中使用来自rails控制器的表单输入。我在rails(版本4.2.1)应用程序上有一个表单,它接受一个url,然后我想在Python脚本中使用该url。我是rails新手,不知道怎么做。我的应用程序已经能够接收表单输入并在页面上呈现它们,还能够调用Python脚本并运行它,但我需要将它们链接在一起 以下是迄今为止的控制器代码:在Python脚本中调用Rails 4参数,python,ruby-on-rails,ruby,ruby-on-rails-4,Python,Ruby On Rails,Ruby,Ruby On Rails 4,我试图在Python脚本中使用来自rails控制器的表单输入。我在rails(版本4.2.1)应用程序上有一个表单,它接受一个url,然后我想在Python脚本中使用该url。我是rails新手,不知道怎么做。我的应用程序已经能够接收表单输入并在页面上呈现它们,还能够调用Python脚本并运行它,但我需要将它们链接在一起 以下是迄今为止的控制器代码: class ContestsController < ApplicationController def index value
class ContestsController < ApplicationController
def index
value = %x(python /Users/my/Desktop/rails_test.py 2>&1)
render :text => value
@contests = Contest.all
end
def new
@contest = Contest.new
end
def create
@contest = Contest.new(contest_params)
if @contest.save
redirect_to contests_url
else
render 'new'
end
end
private
def contest_params
params.require(:contest).permit(:site, :contest_url)
end
end
试试看#1:
<%= form_for @contest do |f| %>
<div>
<%= f.label :site %>
<%= f.text_field :site %>
</div>
<div>
<%= f.label :contest_url %>
<%= f.text_field :contest_url %>
</div>
<%= f.submit %>
<% end %>
我将rails代码修改为:
value = %x(python /Users/jdesilvio/Desktop/rails_test.py #{Shellwords.escape(params[:contest_url])} 2>&1)
我将Python脚本修改为:
#!/Users/me/anaconda/bin/python2.7 python
import sys
print "Python script works!"
print "Url: ", sys.argv[1]
输出为:
Python script works! Url:
我的表格是:
<%= form_for @contest do |f| %>
<div>
<%= f.label :site %>
<%= f.text_field :site %>
</div>
<div>
<%= f.label :contest_url %>
<%= f.text_field :contest_url %>
</div>
<%= f.submit %>
<% end %>
您可以将它们作为命令行参数传递给脚本
%x
执行字符串插值,但您需要小心并验证输入,因为有人可能会将参数[:contest_url]=“&&rm-rf/”
或类似的内容传递到脚本中,并导致您出现问题(永远不要相信用户输入),因此Shellwords()类可以提供帮助。也许是这样
value = %x(/Users/my/Desktop/rails_test.py #{Shellwords.escape(params[:site])} #{Shellwords.escape(params[:contest_url])} 2>&1)
然后让python脚本通过STDIN读取值
#!/usr/bin/env python
import sys
print "Site: ", sys.argv[1]
print "Url: ", sys.argv[2]
我让您的python脚本shebang调用
/usr/bin/env python
,但如果python不在运行rails应用程序的用户路径中,您可能需要完整路径。此外,如果您将其作为python可执行文件的参数调用,则不需要在python脚本顶部添加/bin/bash
查看我做了您建议的更改(见上文),但它没有打印argv
。这就是你让我进入Python路径的意思吗?在我的测试编辑器中,#{Shellwords…}周围的花括号不会关闭,不确定编辑器中是否有错误或代码中是否有问题。看起来参数没有传递。当我这样做时:{Shellwords.escape(“test”)
输出打印'test'
。但是当我这样做时,{Shellwords.escape(params[:contest\u url])
输出是'
。尝试contest\u params[:site]
这也是我的想法,但当我使用contest\u params[:site]
我得到错误:参数丢失或值为空:contest
您的表单是什么样子的?同时查看日志,看看参数散列作为什么传入。您需要匹配它。您是否使用表单?或表单标记?