如何在终端命令中指定python中的变量值?

如何在终端命令中指定python中的变量值?,python,linux,terminal,Python,Linux,Terminal,我的代码: 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.fi

我的代码:

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
os.system('curl--compressed-H“Accept:application/xml”-X GET”http://localhost:19888/ws/v1/history/mapreduce/jobs/的变量值“>”)
>>>/home/ankit/rrd xml/task.xml
如何在python中实现这一点?

您需要的是一个简单的字符串格式


使用
子流程
子流程
模块为生成新流程和检索其结果提供了更强大的工具;使用该模块比使用操作系统功能更可取

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)

在命令周围使用单引号,甚至三引号,以便构成命令一部分的引号不会与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请求。这是一个很好的模块:

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
,并将响应附加到文件中。默认情况下请求压缩。

我想得到像…这样的命令是什么意思。。。?不清楚你在问什么。你是说那个电话的输出吗?或者派生进程的进程ID,或者其他什么?这将无法正常工作。您可能希望将命令拆分为一个列表。或者,由于重定向,设置
shell=True
,并希望它不是不安全的。这仍然不起作用。首先,
split()
将拆分标题
shlex.split()
可能更好。此外,IO重定向将不起作用。您需要打开输出文件并将其作为子对象的标准输出传递给
Popen
;或者不要拆分命令字符串,设置
shell=True
并打开潜在的安全风险。@mhawke感谢您的帮助。非常有用的信息。我希望我能对你的评论投赞成票,但遗憾的是我没有足够的分数这么做。干杯
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)