Python 为包含 ( "'{ " 和 : 字符的变量赋值



我有以下代码:

  import subprocess
    cmd = curl -X POST -H "Content-Type: application/json" -d '{ "auth_token": "e91a0ffe758c194f0d1d5896eb4daed0", "widget": "79c08a7e70f0253c3da2fab39e7cb89b", "title": "Something", "text": "Some text", "moreinfo": "Subtitle" }' http://collector.superviso.com
    subprocess.call(cmd)

我试图给一个变量赋值,这会导致语法错误。情况如下:

>>> cmd = curl -X POST -H "Content-Type: application/json" -d '{ "auth_token": "auth_token", "widget": "widget_id", "title": "Something", "text": "Some text", "moreinfo": "Subtitle" }' http://domain.com
  File "<stdin>", line 1
    cmd = curl -X POST -H "Content-Type: application/json" -d '{ "auth_token": "auth_token", "widget": "widget_id", "title": "Something", "text": "Some text", "moreinfo": "Subtitle" }' http://domain.com
                     ^
SyntaxError: invalid syntax

提前谢谢。

更新01

三引号字符串确实允许我分配值,但子流程不工作

>>> cmd = """curl -X POST -H "Content-Type: application/json" -d '{ "auth_token": "e91a0ffe758c194f0d1d5896eb4daed0", "widget": "329bdbea887ad8e10e4e496f7a60f898", "title": "Something", "items":[{"label": "BOUGHT BREAD FOR", "value": "$999.99"}, {"label": "SOLD WATER FOR", "value": "$9,001.00"}] }' http://collector.superviso.com """
>>> subprocess.call(cmd)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 486, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 672, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1201, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

更新02

多亏了Adam的帖子(见上文),我能够在不分配任何变量的情况下完成请求:

subprocess.call([
    'curl',
    '-X',
    'POST',
    '-H',
    'Content-Type: application/json',
    '-d',
    '{ "auth_token": "e91a0ffe758c194f0d1d5896eb4daed0", "widget": "79c08a7e70f0253c3da2fab39e7cb89b", "title": "Something", "text": "Some text", "moreinfo": "Subtitle" }',
    'http://collector.superviso.com'
    ])

subprocess.call还采用参数列表,而不是单个平面参数字符串。请参阅subprocess文档。使用它比担心正确的引用要容易得多。例如:

subprocess.call([
    'curl',
    '-X',
    'POST',
    '-H',
    'Content-Type: application/json',
    '-d',
    '{ "auth_token": "e91a0ffe758c194f0d1d5896eb4daed0", "widget": "79c08a7e70f0253c3da2fab39e7cb89b", "title": "Something", "text": "Some text", "moreinfo": "Subtitle" }',
    'http://collector.superviso.com'
    ])

即使没有特殊字符,这也不起作用:

>>> cmd = curl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'curl' is not defined

您正试图创建一个字符串,所以您必须使用字符串字面语法的一些变体:

>>> cmd = 'curl'

这使得空格可以接受,并且双引号:

>>> cmd = 'curl -X POST -H "Content-Type: application/json"'

然而,你不能在其中嵌套无标题的单引号。为了解决这个问题,您可以选择转义内部单引号或对整个字符串进行三引号:

>>> cmd = 'curl -X post -H "Content-Type: application/json" -d '{ "auth_token"...'
>>> cmd = """curl -X POST -H "Content-Type: application/json" -d '{ "auth_token"..."""

您想要一个原始的三重双引号字符串r""blah""。

有关更多详细信息,请参阅如何在原始Python字符串中包含引号?

最新更新