在Python脚本中调用Rails 4参数

在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

我试图在Python脚本中使用来自rails控制器的表单输入。我在rails(版本4.2.1)应用程序上有一个表单,它接受一个url,然后我想在Python脚本中使用该url。我是rails新手,不知道怎么做。我的应用程序已经能够接收表单输入并在页面上呈现它们,还能够调用Python脚本并运行它,但我需要将它们链接在一起

以下是迄今为止的控制器代码:

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
您的表单是什么样子的?同时查看日志,看看参数散列作为什么传入。您需要匹配它。您是否使用表单?或表单标记?