如何在终端命令中指定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)