Обертка вокруг 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
Вот еще один метод, использующий 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
Важно отметить, что в командной строке вы не можете передавать объекты 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 не может быть вызвана.)
Проверьте это:
>>> 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]}