0

curl を使用して以下のコマンドを実行すると、成功します。

curl -XPOST 'localhost:9260/icrd_client_1' -d @clientmappings.json

このコマンドは、json ファイルに基づいて Elasticsearch にインデックスを作成します。快適な出力が得られます。

{"ok":true,"acknowledged":true}

私が経験している問題は、Python スクリプトからこのコマンドを実行するときです。

スクリプトを実行した後の上記の快適な出力の代わりに、次の出力が得られます。

['curl', 'XPOST', 'http://localhost:9260/icrd_client_1 -d @clientmappings.json']
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (52) Empty reply from server
Traceback (most recent call last):
  File "./elastic_ops.py", line 57, in <module>
    output = run_curl(command, composed_url)
  File "./elastic_ops.py", line 36, in run_curl
    return subprocess.check_output(cmd)
  File "/usr/lib/python2.7/subprocess.py", line 544, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['curl', 'XPOST', 'http://localhost:9260/icrd_client_1 -d @clientmappings.json']' returned non-zero exit status 52

出力は、cmdline からの実際の curl コマンドから取得したワンライナー json 応答ではありません。2 つの質問があります。

1) どうすれば本当に素敵な出力コマンドをキャプチャできますか:{"ok":true,"acknowledged":true}転送されたネットワーク パケットなどについてのおしゃべりの代わりに.

subprocess2)これが通常の cmdline curl コマンドのように機能するためには、どのコマンドを に送信する必要がありますか。

次のように python スクリプトを呼び出します。

./elastic_ops.py create icrd_client_1 http://localhost:9260 clientmappings.json

そして、これが私のpythonスクリプトの関連コードです:

commandline_args = sys.argv

command_type = commandline_args[1]
index_name = commandline_args[2]
base_elasticsearch_url = commandline_args[3]
file_to_index = sys.argv[4] if len(sys.argv) > 4 else None

def run_curl(command, url):
    cmd = ['curl', command, url]
    print 'sending command: '
    print cmd
    return subprocess.check_output(cmd)

# create Index
# curl -XPOST 'localhost:9260/icrd_client_1' -d @clientmappings.json
if (command_type == 'create'):
    print 'About to run '+command_type+' for Index: '+index_name+' from filename: '+file_to_index
    command = 'XPOST'
    composed_url = base_elasticsearch_url + '/' + index_name +' -d ' + '@'+file_to_index
    print 'URL Request Being sent is:'
    print '.... '+ composed_url
    output = run_curl(command, composed_url)
    print 'output:'
    print output
4

2 に答える 2

3

--silent オプションを使用して curl コマンドを実行する必要があるため、curl 応答が無効になります。したがって、次のようなコマンドを実行する必要があります Pythonスクリプトの実行方法

curl --silent http://example.com/app/test.py | 須藤パイソン -

于 2015-03-10T10:20:39.783 に答える
1

コマンドラインで引数を渡すときに引数を渡す必要があります。だからあなたは合格する必要があります

['curl', '-XPOST', 'http://localhost:9260/icrd_client_1', '-d', '@clientmappings.json']
于 2013-10-25T17:22:53.347 に答える