Как передать список словарей в качестве аргумента командной строки для скрипта python? [Дубликат]

Обертка вокруг GNU ld, которая не поддерживает скрипты компоновщика

. Некоторые .so-файлы на самом деле являются GNU ld ссылками-компоновщиками , например. Файл libtbb.so является текстовым файлом ASCII с этим содержимым:

INPUT (libtbb.so.2)

Некоторые более сложные сборки могут не поддерживать это. Например, если вы включаете -v в параметры компилятора, вы можете видеть, что mainwin gcc wrapper mwdip отбрасывает файлы команд сценария компоновщика в подробном списке результатов библиотек для ссылки. Простая работа вместо файла командной строки ввода сценария компоновщика вместо копии (или символической ссылки), например

cp libtbb.so.2 libtbb.so

Или вы можете заменить аргумент -l полным путем .so, например вместо -ltbb сделать /home/foo/tbb-4.3/linux/lib/intel64/gcc4.4/libtbb.so.2

19
задан PaolaJ. 2 August 2013 в 00:10
поделиться

3 ответа

Вот еще один метод, использующий sdtin. Это метод, который вы хотите использовать для json cgi-интерфейса (т. Е. Чтобы веб-сервер передал запрос на ваш скрипт):

Python:

 import json, sys
 request = json.load( sys.stdin )
...

Чтобы протестировать ваш скрипт из Linux terminal:

echo '{ "key1": "value 1", "key2": "value 2" }' | python myscript.py

Чтобы протестировать ваш скрипт с терминала Windows:

echo { "key1": "value 1", "key2": "value 2" } | python myscript.py
3
ответ дан BuvinJ 28 August 2018 в 10:27
поделиться

Важно отметить, что в командной строке вы не можете передавать объекты python в качестве аргументов. Текущая оболочка, которую вы используете, будет анализировать аргументы и передавать их в соответствии с собственными правилами анализа аргументов.

Как говорится, вы не можете передавать словарь python. Тем не менее, такие вещи, как JSON, могут позволить вам получить красивую черту.

JSON - или представление объектов JavaScript - это способ использования объектов Python и преобразования их в строковое представление, подходящее для передачи по нескольким языки. При этом вы можете передать строку следующим образом:

python saver.py '{"names": ["J.J.", "April"], "years": [25, 29]}'

В вашем скрипте python сделайте следующее:

import json
data=json.loads(argv[1])

Это вернет вам словарь, представляющий данные, которые вы хотели бы передать.

Аналогичным образом вы можете взять словарь python и преобразовать его в строку:

import json
data={'names': ["J.J.", "April"], 'years': [25,29]}
data_str=json.dumps(data)

Существуют и другие способы выполнения этого, хотя JSON довольно универсален. Главное отметить, что независимо от того, как вы это делаете - вы не будете передавать словарь в Python, - вы будете передавать в набор аргументов (которые будут все строки), что вам нужно как-то преобразуйте в нужный тип python.

@EvanZamir - обратите внимание, что (как правило) в оболочке вам нужно избежать кавычек, если они появляются в вашей цитируемой строке. В моем примере я цитирую данные JSON с одинарными кавычками, а сама строка json использует двойные кавычки, тем самым устраняя необходимость в котировках.

Если вы смешиваете кавычки (используйте двойные кавычки для цитирования аргумента и двойные кавычки внутри), то оболочка потребует, чтобы она была экранирована, в противном случае первая двойная кавычка, которую она встречает, считается «закрывающей цитатой» для аргумента. Обратите внимание, что в примере я использую одинарные кавычки , чтобы заключить строку JSON и двойные кавычки внутри строки. Если бы я использовал одиночные кавычки в строке, мне нужно было бы избежать их с помощью обратного слэша, то есть:

python saver.py '{"names": ["J.J.", "April\'s"], "years": [25, 29]}'

или

python saver.py "{\"names\": [\"J.J.\", \"April's\"], \"years\": [25, 29]}"

Обратите внимание, что материал цитирования является функцией ваша оболочка, поэтому YMMV может отличаться (например, если вы используете какой-либо метод exec для вызова скрипта, экранирование может не потребоваться, так как оболочка bash не может быть вызвана.)

29
ответ дан chander 28 August 2018 в 10:27
поделиться

Проверьте это:

>>> from sys import argv
>>> from re import findall
>>> args = ' '.join(argv[1:])
>>> pattern = r'([^=]+)\s*=\s*\[\s*([^\]]+)\s*\]'
>>> d = dict((t[0].strip(), map(lambda x: x.strip(', '),t[1].split())) for t in findall(pattern,args))
>>> for k,v in d.items():
    try: d[k] = map(int,v)
    except: pass    
>>> d
{'names': ['"J.J."', '"April"'], 'years': [25, 29]}
0
ответ дан mshsayem 28 August 2018 в 10:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: