python 将请求 headers 存储为变量?

python storing requests headers as a variable?

我有

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

效果很好。但是我希望能够将其指定为参数,所以在我的参数中可以说我有

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

这很好

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

...但是当我这样做时

headers = args.wsheaders

我遇到了很多错误。所以很明显 headers 不能是一个字符串。但是必须有一种方法可以将它存储在可以在变量中读回的地方吗?有什么想法吗?

编辑:我不能在参数周围使用单引号。我还在学习这个,但看起来我不能在从文件传递参数时在参数周围使用单引号或双引号,就像 I CAN 但它不能将字符组合在一起,它变成了文字部分这个论点没有帮助,因为我在 space 之前或之后失去了一切。查看附件以了解文件中的内容。

--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 需要在我输入 arg 后被替换,但是变量是一个字符串,我又回到了原来的问题。

type=json.loads

在存在\s 时在参数定义中不起作用,因为它是无法识别的json。如果有一种方法可以用 argparse 替换 \s ,那么首先这样做可能会奏效……但我认为那是不可能的。使用 space 然后使用 \s

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

编辑

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

根据下面的 bschlueter 评论,此 有效

假设您在 python 脚本中使用 --wsheaders 作为参数,您需要做的就是在将 headers 传递给脚本时引用它们:

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

然后将它们解析为 json 以获取字典。

使用pyyaml:

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

编辑:

如果您正在使用 argparse(正如您应该的那样),您可以在解析 args 时通过声明参数来轻松地进行解析:

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

我假设你使用了 argparse

事实上 argparse uses sys.argv which captures passed arguments as string. So in this case you are passing dictionary as string and for this reason you need to parse it as dictionary because requests 需要 header 作为字典。

因此 headers = args.wsheaders 是无用的,因为 args.wsheaders 是字符串。您需要使用 json or ast 将其解析为字典,如下所示-

headers = ast.literal_eval(args.wsheaders)

有关将字典作为 command-line 参数传递并在 here, here and here 处正确解析它们的更多详细信息。