У меня были аналогичные проблемы с Xcode 7.3:
Не удалось открыть файл «FirstSteps.temp_caseinsensitive_rename», потому что у вас нет разрешения на просмотр.
В моем случае решение заключалось в том, чтобы изменить имя продукта в разделе «Упаковка» настроек сборки:
с «FirstSteps.temp_caseinsensitive_rename» на «FirstSteps»
Я нашел модуль python 2, который может обрабатывать такие случаи.
Предположим, что у вас есть эта строка:
>>> str = '{foo: bar, id: 23}'
Затем вы можете использовать yaml
следующим образом:
>>> import yaml
>>> dict = yaml.load(str)
>>> dict
{'foo': 'bar', 'id': 23}
>>> dict['foo']
'bar'
Теперь у вас есть то, что вам нужно.
Дополнительная информация (а также поддержка python 3 и т. д.) можно найти здесь: https: // pyyaml. орг / вики / PyYAMLDocumentation
Не уверен, что то, что вы проходите, важно, но вы можете передать следующее и получить желаемый результат:
"{\"key1\":\"value1\", \"key2\":\"value2\"}"
или
'{"key1":"value1", "key2":"value2"}'
Вот код и вывод:
$cat json_convert.py
import json
import sys
dict_in = json.loads(sys.argv[1])
print (dict_in)
$ python json_convert.py '{"key1":"value1", "key2":"value2"}'
{'key1': 'value1', 'key2': 'value2'}
То, что вы передаете """{"key1":"value1", "key2":"value2"}"""
, переводится в "" + "{" + key1 + ":" + value1 + ", " + + key2 + ":" + value2 + "}" + ""
, если вы спрашиваете bash
, если вы вызывали функцию с этим в качестве аргумента из самого python
, вы бы получить желаемые результаты.
Так что действительно идет вниз к тому, из чего вы его вызываете.
Если вам все еще нравятся кавычки, пройдите """{"'"key1"'":"'"value1"'", "'"key2"'":"'"value2"'"}"""
, чтобы получить желаемый результат:)
используйте либо:
$ your_other_program | python main.py
, чтобы отправить выход другой программы на python, либо использовать base64.b64encode(json.dumps(blah))
, и вы получите красивый код, например
. 'eyJtQXV0b21hdGljVGVzdExpc3QiOiBbeyJtWSI6IDguMTE0MTA1LCAibU5hbWUiOiAiYWNjZWxlcmF0b3JFbnRpdHkiLCAibVRlc3RTdGF0dXMiOiB0cnVlLCAibVgiOiAzLjgwNDM1MTgsICJtWiI6IC0zLjM4OTU3MjF9LCB7Im1OYW1lIjogImJhcm9tZXRlckVudGl0eSIsICJtVmFsdWUiOiAwLCAibVRlc3RTdGF0dXMiOiBmYWxzZX1dLCAibUF1dG9tYXRpY1Rlc3RDb21wbGV0ZWQiOiB0cnVlfQ =='
BLOCKQUOTE>, чтобы поместить в командной строке, а затем декодировать его обратно из
base64
в формате JSONИли, еще лучше, используйте:
$ your_other_program >output_file.tmp $ python main.py < output_file.tmp $ rm output_file.tmp
Итак, вот что такое мой тестовый скрипт:
print("original sys.argv output\n" + (sys.argv[1]))
string_temp=(yaml.load(sys.argv[1]))
print ("first transformation\n" +string_temp)
string_temp=string_temp.replace(":",": ")
dict_in=yaml.load(string_temp)
print("This is the dictionary")
print(dict_in)
Это то, что я набираю в консоль
python test_script.py """{foo:bar, id:23}"""
И это вывод
original sys.argv output
"{foo:bar, id:23}"
first transformation
{foo:bar, id:23}
This is the dictionary
{'foo': 'bar', 'id': 23}
Это работает только в том случае, если я использую трипсовые кавычки ("" "). Если я использую (") или (') для определения входной строки, я получаю сообщение об ошибке.
В качестве альтернативы можно удалить (") из sys.argv[1]
print("original sys.argv output\n" + (sys.argv[1]))
string_temp=(sys.argv[1])[1:-1]
print ("first transformation\n" +string_temp)
string_temp=string_temp.replace(":",": ")
dict_in=yaml.load(string_temp)
print("This is the dictionary")
print(dict_in)
str
как первый вход, который являетсяsys.argv[1]
и с приведенным выше кодом, вы получите ответ, который вы хотите :) – imans77 13 July 2018 в 20:13:
, иначе вы получите ошибку. Любой способ избежать этого? 2) Мне нужно вызвать yaml.load дваждыdict_in=yaml.load(yaml.load(sys.argv[1]))
по какой-то странной причине. Первый раз он преобразует его в строку, второй раз в словарь – valenzio 16 July 2018 в 08:13sys.argv[1]
, который послеyaml.load
превращается в строку ?! Это уже строка. Что вы получаете после первогоyaml.load
? Та же строка, которая была передана ему? – imans77 16 July 2018 в 13:25