Мне нужно использовать команду оболочки для запуска скрипта 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 превращается в список строк. Оболочка не знает синтаксиса 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]
Вот альтернатива, которая вам может понравиться: отправьте ее как одну строку и импортируйте ее как закодированную 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-декодера, я не могу сказать, открывает ли он какие-либо дыры в безопасности, но могу сказать, что вы должны быть осторожны, как вы используете декодированные значения, чтобы убедиться, что вы не добавляете никаких своих собственных.
Надеюсь это поможет.
Более чистый способ делать то, что вы просите (в основном, если вам нужны другие параметры), будет идентифицировать ваш список из другого параметра и перечислить разрешенные типы (при необходимости конвертировать), который будет выглядеть примерно так:
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 еще лучше!