2016-03-26 7 views
-1

У меня естьpython хранит заголовки запросов как переменную?

headers = {'content-type': 'application/soap+xml'} 

, который работает отлично. Однако я хочу, чтобы это было в состоянии быть указан в качестве аргумента, так в моих аргументах позволяет сказать, что у меня есть

--wsheaders {'content-type':\s'application/soap+xml'} 

Это приходит через штраф, как

{'content-type': 'application/soap+xml'} 

... Однако, когда я

headers = args.wsheaders 

Я получаю массу ошибок. Поэтому очевидно, что заголовки не могут быть строкой. Но должен быть способ сохранить это, где его можно прочитать в переменной? Есть идеи?

EDIT: Я не могу использовать одинарные кавычки вокруг аргумента. Я все еще изучаю это, но кажется, что я не могу использовать одиночные или двойные кавычки вокруг аргумента при передаче аргументов из файла, например, я МОГУ, но он не работает, чтобы группировать символы вместе, вместо этого становится литеральной частью аргумента, который не помогает, поскольку я теряю все до или после пробела. см. вложение для того, как он выглядит в файле.

wsheaders in properties file

--wsheaders '{'content-type': 'application/soap+xml'}' 

ошибка при использовании одинарных или двойных кавычек

Sync03.py: error: unrecognized arguments: 'application/soap+xml'}' 
Sync03.py: error: unrecognized arguments: 'application/soap+xml'}" 

так что вместо этого я использую

--wsheaders {'content-type':\s'application/soap+xml'} 

, но тогда потребностей \ S заменить после арг введено, которое я делаю, но тогда переменная - это строка, и я возвращаюсь к исходнику все проблемы.

type=json.loads 

не работает в определении аргумента, когда есть \ s, так как это непризнанное JSON. Если бы был способ заменить \ s на argparse, это могло бы сработать, чтобы сделать это сначала ... но я не думаю, что это возможно. С пространства, то с \ сек

Sync03.py: error: argument --wsheaders: invalid loads value: "{'content-type':" 
Sync03.py: error: argument --wsheaders: invalid loads value: "{'content-type':\\s'application/soap+xml'}" 

EDIT

parser.add_argument('--wsheaders', type=lambda x: json.loads(x.replace('\s', '').replace('\'', '"'))) 

Этот работал согласно bschlueter комментарий непосредственно ниже.

+0

Вы должны опубликовать, по крайней мере, ошибки, возникающие в вашем коде, если сможете. – bschlueter

+0

'' {'content-type': 'application/soap + xml'} ''не работает, потому что внутренний' '' соответствует предыдущим. Вам нужно будет избежать внутренних, чтобы это было допустимой строкой. '' {\ 'content-type \': \ 'application/soap + xml \'} ''сделает его единственной, допустимой строкой, но это недействительно json, потому что json требует двойных кавычек. '' {"content-type": "application/soap + xml"} ''является допустимым json-представлением одних и тех же данных. – bschlueter

+0

Вы абсолютно можете заменить * \ s * на argparse, просто используйте настраиваемый тип, который исправляет ввод: 'parser.add_argument ('- wsheaders', type = lambda x: json.loads (x.replace ('\ s ',' ') .replace (' \ '', '' '))) '. – bschlueter

ответ

0

Предполагая, что вы потребляя --wsheaders в вашем питона скрипт в качестве аргумента как-то, все, что вам нужно сделать, это цитата заголовки, когда вы передаете их в сценарий:

the_script --wsheaders '{"content-type": "application/soap+xml"}' 

Затем разобрать их как JSON в получить dict.

Использование PyYAML:

>>> import yaml 
>>> yaml.load(args.wsheaders) 
{'content-type': 'application/soap+xml'} 

EDIT:

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

parser = argparse.ArgumentParser() 
parser.add_argument('--wsheaders', type=json.loads) 
args = parser.parse_args() 
+0

Что? Может ли downvoter любезно объяснить их аргументацию? – bschlueter

+0

donno почему downvote, но это работала отлично. На самом деле я не знал, что такое yaml до сих пор. Я надеялся, что смогу сделать это, не добавляя еще один пакет (yaml), как в живой среде, используя этот скрипт, установка внешних вещей жесткая. там, но вы сказали, что работает с pyaml, установленным импортом yaml. Вам придется найти автономный способ срыв его Спасибо кучу! –

+0

Ямль - это надмножество json, и по умолчанию у меня загружена оболочка, поэтому было легче добраться до json на крошечную сумму. Очевидно, что 'json.loads (args.wsheaders)' будет работать так же хорошо. – bschlueter

1

Я предположил, что вы использовали argparse.

Фактически argparse использует sys.argv, который захватывает переданные аргументы как строку. Поэтому в этом случае вы передаете dictionary в качестве строки, и по этой причине вам нужно проанализировать его как словарь, потому что requests нуждается в заголовке в качестве словаря.

По этой причине headers = args.wsheaders бесполезен с args.wsheaders является строкой. Вы должны использовать json или ast разобрать его в словаре, как ценам ниже

headers = ast.literal_eval(args.wsheaders)

Более подробную информацию о прохождении словаря в качестве аргумента командной строки и разбор их правильно в here, here и here.

+0

Это не объясняет, как заголовки передаются скрипту. – bschlueter

+0

@bschlueter видит '--wsheaders' и' args.wsheaders' i * предполагается * он использует передачу аргументов командной строки с использованием 'argparse', как упоминалось выше. – SIslam

+0

Правильно, но способ, которым ОП описывал передачу аргумента '' wwheaders', обязательно завершился бы неудачей из-за того, как оболочка передаст его на python. – bschlueter