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}
転送されたネットワーク パケットなどについてのおしゃべりの代わりに.
subprocess
2)これが通常の 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