subprocess.call()格式化问题

时间:2017-09-11 13:19:10

标签: python python-2.7 subprocess

我对subprocess很新,我有一个很难调试它没有任何错误代码。

我试图自动调用响应的API:

http -f POST https://api-adresse.data.gouv.fr/search/csv/ columns=voie columns=ville data@path/to/file.csv > response_file.csv

我尝试过与subprocess.call的各种组合,但我只能设法得到" 1"作为错误代码。 格式化此调用的正确方法是什么,知道API的答案必须放在csv文件中,并且我发送了一个csv(@data之后的路径)?

编辑:以下是我的尝试:

ret = subprocess.call(cmd,shell=True)
ret = subprocess.call(cmd.split(),shell=True)
ret = subprocess.call([cmd],shell=True)
  • 与shell = False相同,并且使用stdout = myFileHandler(在open中打开(文件," 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)

1 个答案:

答案 0 :(得分: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-requests api参数。