简体   繁体   中英

subprocess.call() formatting issue

I am very new to subprocess , and I have a hard debugging it without any error code.

I'm trying to automatically call an API which respond to :

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

I've tried various combination with subprocess.call , but I only manage to get "1" as an error code. What is the correct way to format this call, knowing that the answer from the API has to go in a csv file, and that I send a csv (path after the @data)?

EDIT: Here are my attempts :

ret = subprocess.call(cmd,shell=True)
ret = subprocess.call(cmd.split(),shell=True)
ret = subprocess.call([cmd],shell=True)
  • The same with shell = False , and with stdout = myFileHandler (open inside a with open(file,"w") as myFileHandler:)

EDIT2 : still curious about the answer, but I managed to go around with Request, as @spectras suggested

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)

Since you are attempting to send a form, may I suggest you do it straight from 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)

This uses the ubiquitous python-requests module, and especially the form file upload part of the documentation.

It's untested. Basically, I opened httpie documentation and converted your command line arguments into python-requests api arguments.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM