Python Forum
Passing List of Objects in Command Line Python - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Passing List of Objects in Command Line Python (/thread-29957.html)



Passing List of Objects in Command Line Python - usman - Sep-27-2020

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


RE: Passing List of Objects in Command Line Python - ndc85430 - Sep-27-2020

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.


RE: Passing List of Objects in Command Line Python - usman - Sep-27-2020

I have a added a Single Quote but it also did not work.

I am using Windows


RE: Passing List of Objects in Command Line Python - ndc85430 - Sep-27-2020

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.


RE: Passing List of Objects in Command Line Python - snippsat - Sep-27-2020

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'}]



RE: Passing List of Objects in Command Line Python - usman - Sep-27-2020

Thanks for the reply,
What should I do for multiple JSON objects for productname_1,product_name2?


RE: Passing List of Objects in Command Line Python - snippsat - Sep-27-2020

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'}]



RE: Passing List of Objects in Command Line Python - ndc85430 - Sep-27-2020

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..