我有以下代码:
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字符串中包含引号?