我的代码:
import os
from xml.dom import minidom
doc = minidom.parse("jobs.xml")
job = doc.getElementsByTagName("job")[0]
id = job.getElementsByTagName("id")[0]
name = job.getElementsByTagName("name")[0]
id_data = id.firstChild.data
name_data = name.firstChild.data
os.system('curl --compressed -H "Accept: application/xml" -X GET "http://localhost:19888/ws/v1/history/mapreduce/jobs/"')
>>> /home/ankit/rrd-xml/task.xml
我想获得像
这样的命令os.system('curl --compressed -H "Accept: application/xml" -X GET "http://localhost:19888/ws/v1/history/mapreduce/jobs/< variable value of name_data >"')
>>> /home/ankit/rrd-xml/task.xml
我怎么能在python本身做到这一点?
答案 0 :(得分:2)
在命令周围使用单引号,甚至使用三引号,以便构成命令一部分的引号不会与Python字符串混淆:
os.system('curl --compressed -H "Accept: application/xml" -X GET "http://localhost:19888/ws/v1/history/mapreduce/jobs/{}" >> /home/ankit/rrd-xml/task.xml'.format(name_data))
这会奏效,但并不是最好的。使用Python来发出HTTP请求会更好。 requests
是一个很好的模块:
import requests
url = 'http://localhost:19888/ws/v1/history/mapreduce/jobs/{}'.format(name_data)
headers = {'Accept': 'application/xml'}
response = requests.get(url, headers=headers)
with open('/home/ankit/rrd-xml/task.xml', 'a') as outfile:
outfile.write(response.content)
此代码将获取URL,将Accept
标头设置为application/xml
并将响应附加到文件。默认情况下请求压缩。
答案 1 :(得分:1)
您想要的是一个简单的字符串格式。
import os
from xml.dom import minidom
doc = minidom.parse("jobs.xml")
job = doc.getElementsByTagName("job")[0]
id = job.getElementsByTagName("id")[0]
name = job.getElementsByTagName("name")[0]
id_data = id.firstChild.data
name_data = name.firstChild.data
url = 'http://localhost:19888/ws/v1/history/mapreduce/jobs/{name}'.format(name=name_data)
cmd = 'curl --compressed -H "Accept: application/xml" -X GET "{url}"'.format(url=url)
os.system(cmd)
答案 2 :(得分:0)
使用subprocess
。 subprocess
模块提供了更强大的工具来生成新流程并检索其结果;使用该模块比使用os.system
函数更好。
import subprocess
import shlex
command = shlex.split('curl --compressed -H "Accept: application/xml" -X GET http://localhost:19888/ws/v1/history/mapreduce/jobs/')
with open('/home/ankit/rrd-xml/task.xml', 'a') as f:
subprocess.Popen(command, stdout=f)