【问题标题】:how to assign variable value in python in terminal commands?如何在终端命令中的python中分配变量值?
【发布时间】:2016-02-07 10:29:22
【问题描述】:

我的代码:

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 本身中做到这一点?

【问题讨论】:

  • 我想得到类似...的命令是什么意思?不清楚你在问什么。你的意思是那个电话的输出吗?或者衍生进程的进程ID,还是别的什么?

标签: python linux terminal


【解决方案1】:

在命令周围使用单引号,甚至是三引号,这样构成命令一部分的引号就不会与 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 并将响应附加到文件中。默认情况下会请求压缩。

【讨论】:

    【解决方案2】:

    你想要的是一个简单的字符串格式

    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)
    

    【讨论】:

      【解决方案3】:

      使用subprocesssubprocess 模块提供了更强大的工具来生成新进程并检索它们的结果;使用该模块优于使用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)
      

      【讨论】:

      • 这不会按原样工作。您可能希望将命令拆分为一个列表。或者,因为重定向,设置shell=True,希望不是不安全的。
      • 这仍然行不通。一方面,split() 将拆分标题。 shlex.split() 可能会更好。此外,IO 重定向将不起作用。您需要打开输出文件并将其作为孩子的标准输出传递给Popen;或者不要拆分命令字符串,设置shell=True 并打开潜在的安全风险。
      • @mhawke 感谢这位伙伴。那里非常有用的信息。我希望我可以投票给你的 cmets,但遗憾的是我没有足够的积分来投票。干杯!
      猜你喜欢
      • 1970-01-01
      • 2019-03-21
      • 2018-09-23
      • 2018-01-12
      • 2017-08-12
      • 2022-01-27
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      相关资源
      最近更新 更多