Команда оболочки запускает скрипт Python с аргументами, представляющими собой список [дубликаты]

1

Мне нужно использовать команду оболочки для запуска скрипта python

но args - это список скриптов python:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import sys

def main(task_list):
    print('task_list:',task_list)

if __name__=='__main__':
main(sys.argv[1])

когда я использую оболочку python

python scrpit.py [("store", "IDCODE", 18116485, 88779)]

система показывает: "(" есть ошибка ")

как я могу перевести список в скрипт?

("store", "IDCODE", 18116485, 88779) является аргументом

Теги:
python-3.x
command

3 ответа

0
Лучший ответ

Оболочка передает вашей программе массив строк, что Python превращается в список строк. Оболочка не знает синтаксиса Python. Вы могли бы назвать свою

$ python scrpit.py '[("store", "IDCODE", 18116485, 88779)]'

затем используйте ast.literal_eval чтобы разобрать это в список.

import sys
import ast

if len(sys.argv) == 2:
    data = ast.literal_eval(sys.argv[1])
    print(data)

выход

[('store', 'IDCODE', 18116485, 88779)]

Однако было бы более надежно получать args как отдельные строки.

import sys

if len(sys.argv) == 5:
    name, code, num1, num2 = sys.argv[1:]
    num1, num2 = int(num1), int(num2)
    data = [name, code, num1, num2]
    print(data)

Назовите это как

$ python scrpit.py "store" "IDCODE" 18116485 88779

И выход

['store', 'IDCODE', 18116485, 88779]
0

Вот альтернатива, которая вам может понравиться: отправьте ее как одну строку и импортируйте ее как закодированную json. Просто "import json" и измените ваш вызов main(), чтобы выглядеть так:

main(json.JSONDecoder().decode(sys.argv[1]))

и вызовите скрипт с параметрами внутри одинарных кавычек, но не указывайте(), чтобы он выглядел как правильная кодировка json:

python scrpit.py '["store", "IDCODE", 18116485, 88779]'

который дает мне вывод, который выглядит так:

('task_list:', [u'store', u'IDCODE', 18116485, 88779])

Это также позволит вам отправлять более сложные структуры, такие как:

python try.py '{"p2": {"a": 1, "b": 2}, "p1": ["a", "B", "c"]}'
('task_list:', {u'p2': {u'a': 1, u'b': 2}, u'p1': [u'a', u'B', u'c']})

Не анализируя внутренности json-декодера, я не могу сказать, открывает ли он какие-либо дыры в безопасности, но могу сказать, что вы должны быть осторожны, как вы используете декодированные значения, чтобы убедиться, что вы не добавляете никаких своих собственных.

Надеюсь это поможет.

  • 0
    спасибо тебе ответ
0

Более чистый способ делать то, что вы просите (в основном, если вам нужны другие параметры), будет идентифицировать ваш список из другого параметра и перечислить разрешенные типы (при необходимости конвертировать), который будет выглядеть примерно так:

import sys, getopt
sh_params, args = getopt.getopt(sys.argv[1:], "l:")

def convert_type(elem):
    for fn in (int, lambda e: e.strip('"')): # Lambda is the string conversion function and int is auto-cast fct
        try:
            return fn(elem)
        except ValueError:
            pass
    return elem

my_list = []
for param, val in sh_params:
    if param == "-l":
        my_list = [convert_type(elem) for elem in val.strip('[]').split(', ')]
print(my_list)

вот команда & result:

$ python3 scrpit.py -l '["store", "IDCODE", 18116485, 88779]'
$ ['store', 'IDCODE', 18116485, 88779]

Помните, что альтернатива PM 2Ring еще лучше!

  • 0
    искренне благодарю за ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню