Python Forum

Full Version: Passing List of Objects in Command Line Python
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I am trying to pass a argument to command line for running a python program which takes list of Field Objects and send an email. The program is running fine when the list of objects is already set in my program.


a=[{"name": "productname_0", "type": "html", "content": "A Cool Shirt"}, {"name": "productname_1", "type": "html", "content": "Some Nice Shoes"}, {"name": "productname_2", "type": "html", "content": "A Trendy Hat"}, {"name": "productprice_0", "type": "html", "content": "20.99"}, {"name": "productprice_1", "type": "html", "content": "50.99"}, {"name": "productprice_2", "type": "html", "content": "FREE"}]
sendmail(a)
But when I pass this list in command line ,it did not work for me.
a = json.loads(sys.argv[1])
sendmail(a)
Running Program from Command Line
mailscript.py '[{"name": "productname_0", "type": "html", "content": "A Cool Shirt"}, {"name": "productname_1", "type": "html", "content": "Some Nice Shoes"}, {"name": "productname_2", "type": "html", "content": "A Trendy Hat"}, {"name": "productprice_0", "type": "html", "content": "20.99"}, {"name": "productprice_1", "type": "html", "content": "50.99"}, {"name": "productprice_2", "type": "html", "content": "FREE"}]'
Error : json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Python Version :3.8.5
Show us how you're passing the JSON on the command line and tell us which OS you're using. You possibly need to quote it or something.
I have a added a Single Quote but it also did not work.

I am using Windows
Apologies; I didn't read your post properly. Hmm, I'm not sure about Windows I'm afraid. Perhaps look up how you're meant to quote things on the command line there.
Have to do some converting stuff for this to work,there is no easy fix with quotes or anything else.
Prepare command to use in command line.
lst = [{"name": "productname_0", "type": "html", "content": "A Cool Shirt"}]
command_lst = list(lst[0].items())
print(f'"{command_lst}"')
Output:
"[('name', 'productname_0'), ('type', 'html'), ('content', 'A Cool Shirt')]"
# sys_a.py
import sys, ast
import json

arg_command = sys.argv[1]
a_eval = ast.literal_eval(arg_command)
d_arg = dict(a_eval)
lst = []
lst.append(d_arg)
print(lst)

# Test json
j = json.dumps(lst)
# print(j)
load_j = json.loads(j)
print(load_j)
Test command line:
Output:
C:\code λ python sys_a.py "[('name', 'productname_0'), ('type', 'html'), ('content', 'A Cool Shirt')]" [{'name': 'productname_0', 'type': 'html', 'content': 'A Cool Shirt'}] [{'name': 'productname_0', 'type': 'html', 'content': 'A Cool Shirt'}]
Thanks for the reply,
What should I do for multiple JSON objects for productname_1,product_name2?
I will be like this,not so easy to pass all this trough command line Windows.
There may be a better way if i had use Click,and maybe pass a file object instead.

Make argument
lst = [{"name": "productname_0", "type": "html", "content": "A Cool Shirt"}, {"name": "productname_1", "type": "html", "content": "Some Nice Shoes"}, {"name": "productname_2", "type": "html", "content": "A Trendy Hat"}, {"name": "productprice_0", "type": "html", "content": "20.99"}, {"name": "productprice_1", "type": "html", "content": "50.99"}, {"name": "productprice_2", "type": "html", "content": "FREE"}]

command_lst = []
for index,item in enumerate(lst):
    command_lst.append(list(lst[index].items()))
print(f'"{command_lst}"')
# command_arg.py
import sys, ast
import json
from pprint import pprint

arg_command = sys.argv[1]
a_eval = ast.literal_eval(arg_command)
lst = []
for i in a_eval:
    d_arg = dict(i)
    lst.append(d_arg)
print(lst)

# Test json
j = json.dumps(lst)
# print(j)
load_j = json.loads(j)
pprint(load_j)
Command line:
Output:
C:\code\json_commandline λ python command_arg.py "[[('name', 'productname_0'), ('type', 'html'), ('content', 'A Cool Shirt')], [('name', 'productname_1'), ('type', 'html'), ('content', 'Some Nice Shoes')], [('name', 'productname_2'), ('type', 'html'), ('content', 'A Trendy Hat')], [('name', 'productprice_0'), ('type', 'html'), ('content', '20.99')], [('name', 'productprice_1'), ('type', 'html'), ('content', '50.99')], [('name', 'productprice_2'), ('type', 'html'), ('content', 'FREE')]]" [{'name': 'productname_0', 'type': 'html', 'content': 'A Cool Shirt'}, {'name': 'productname_1', 'type': 'html', 'content': 'Some Nice Shoes'}, {'name': 'productname_2', 'type': 'html', 'content': 'A Trendy Hat'}, {'name': 'productprice_0', 'type': 'html', 'content': '20.99'}, {'name': 'productprice_1', 'type': 'html', 'content': '50.99'}, {'name': 'productprice_2', 'type': 'html', 'content': 'FREE'}] [{'content': 'A Cool Shirt', 'name': 'productname_0', 'type': 'html'}, {'content': 'Some Nice Shoes', 'name': 'productname_1', 'type': 'html'}, {'content': 'A Trendy Hat', 'name': 'productname_2', 'type': 'html'}, {'content': '20.99', 'name': 'productprice_0', 'type': 'html'}, {'content': '50.99', 'name': 'productprice_1', 'type': 'html'}, {'content': 'FREE', 'name': 'productprice_2', 'type': 'html'}]
That isn't valid JSON though. I'd be very surprised if you couldn't escape quotes in Windows to let you do what you want. Then again, I'm not a Windows user, so..