subprocess.call()格式问题

subprocess.call()格式问题

问题描述:

我对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之后的路径)?

编辑:这里是我的尝试:

ret = subprocess.call(cmd,shell=True) 
ret = subprocess.call(cmd.split(),shell=True) 
ret = subprocess.call([cmd],shell=True) 
  • 与外壳= False相同,并与标准输出= 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,可能会认为正确的方式是直接使用python进行调用,例如使用[requests](http://docs.python-requests.org/en/master/)模块。 – spectras

+0

我不是如何通过请求发送csv文件,虽然 – CoMartel

既然你正在试图发送一个表单,我可以建议你直接从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参数。