2017-09-11 14 views
0

私は非常に新しいsubprocessです。エラーコードなしでハードデバッグしています。subprocess.call()書式設定の問題

私は自動的に反応するAPIを呼び出すためにしようとしている:

http -f POST https://api-adresse.data.gouv.fr/search/csv/ columns=voie columns=ville [email protected]/to/file.csv > response_file.csv 

私はsubprocess.callと、様々な組み合わせを試してみたが、私は唯一のエラーコードとして「1」を取得するために管理します。 APIからの回答がcsvファイルに入っていなければならないこと、そしてcsv(@dataの後のパス)を送信していることを知って、この呼び出しをフォーマットする正しい方法は何ですか?

EDIT:

ret = subprocess.call(cmd,shell=True) 
ret = subprocess.call(cmd.split(),shell=True) 
ret = subprocess.call([cmd],shell=True) 
  • シェル= Falseと、およびSTDOUT = myFileHandler)オープン(ファイル、 "W" の内側(オープンとmyFileHandler同じ:)
  • :ここに私の試みがされています

EDIT2:まだ答えは好奇心が、@spectrasは

file_path = "PATH/TO/OUTPUT/FILE.csv" 
url = "https://api-adresse.data.gouv.fr/search/csv/" 
files = {'data': open('PATH/TO/CSV/FILE.csv','rb')} 
values = {'columns': 'Adresse', 'columns': 'Ville', 'postcode': 'CP'} 
r = requests.post(url, files=files, data=values) 
with open(file_path, "w") as myFh: 
    myFh.write(r.content) 
を示唆したように、私は、リクエストに回ることに成功し
+0

あなたの試行を表示してください。そうでなければ、これは広すぎます。 –

+0

Pythonを使用している場合は、[request](http://docs.python-requests.org/en/master/)モジュールなど、Pythonで直接呼び出しを行うのが適切な方法であると主張することができます。 – spectras

+0

私はcsvファイルをどのようにリクエストして送信するのかわからない – CoMartel

答えて

2

フォームを送信しようとしているので、私はあなたが直接Pythonからそれを行うことをお勧めしますか?

import requests 

with open('path/to/file', 'rb') as fd: 
    payload = fd.read() 

r = requests.post(
    'https://api-adresse.data.gouv.fr/search/csv/', 
    data=(
     ('columns', 'voie'), 
     ('columns', 'ville'), 
    ), 
    files={ 
     'data': ('filename.csv', payload, 'text/csv'), 
    } 
) 
if r.status_code not in requests.codes.ok: 
    r.raise_for_status() 

with open('response_file.csv', 'wb') as result: 
    result.write(r.content) 

これはユビキタスpython-requestsモジュール、およびドキュメントの、特にform file upload一部を使用しています。

これはテストされていません。基本的には、httpieのドキュメントを開いて、コマンドライン引数をPython-Request api引数に変換しました。