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)
答
既然你正在试图发送一个表单,我可以建议你直接从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参数。
请显示您的尝试,否则这是太宽泛。 –
如果您使用的是python,可能会认为正确的方式是直接使用python进行调用,例如使用[requests](http://docs.python-requests.org/en/master/)模块。 – spectras
我不是如何通过请求发送csv文件,虽然 – CoMartel