将curl命令转换为python

时间:2016-05-24 21:53:04

标签: python bash curl

我是Python新手。我试图使用子进程将下面的bash脚本命令转换为Python。当我执行我的Python脚本时,我没有得到任何输出,也没有看到任何失败。

这是需要移植到Python的bash命令。

curl -u 'lawn:oldlawn!' -k -s -H 'Content-Type: application/json' -X GET 'https://192.168.135.20:443/api/json/v2/types/dev-objs/1'

我的python代码:

get_curl():
  curl = """curl -u 'lawn:oldlawn!' -k -s -H 'Content-Type: application/json' -X GET 'https://192.168.135.20:443/api/json/v2/types/dev-objs/1'"""

  args = curl.split()

  process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

  stdout, stderr = process.communicate()
  print stdout
  print stderr

# End of python code

执行get_curl()后,print stdoutprint stderr不会打印任何内容,但dev-objs/1存在。

当我执行与bash命令相同的命令时,它可以工作,我看到REST API输出。

任何人都可以帮我解决这里可能出现的问题吗?感谢

2 个答案:

答案 0 :(得分:3)

您可以使用requests

headers = {
    'Content-Type': 'application/json',
}


import requests

proxies = {
  'https': 'https://lawn:oldlawn!@192.168.135.20:443',
}

req = requests.get('https:...', proxies=proxies, verify=False, headers=headers)

我不认为请求有-s标志,因为除非您打印 req.json()返回的内容,否则不会输出任何数据。

我认为您有一个大写U而不是u所以您真正需要做的就是使用basic-authentication传递auth = (user, pass),设置verify=False根据{{​​3}}。

为什么你的子进程代码不起作用是因为你引用了一些类似"'lawn:oldlawn!'"的args,你想要的是:

args = ['curl',
 '-u',
 'lawn:oldlawn!',
 '-k',
 '-s',
 '-H',
 'Content-Type: application/json',
 '-X',
 'GET',
 'https://192.168.135.20:443/api/json/v2/types/dev-objs/1']

process = subprocess.Popen(args, shell=False,   stdout=subprocess.PIPE, stderr=subprocess.PIPE)

stdout, stderr = process.communicate()

答案 1 :(得分:1)

使用Generate dynamic unique id会使您的http请求变得更加简单:

// psuedo code
while( true ) {
    line = "enter score or s to skip".prompt()

    if (!"s".equals(line)) { // it wasn't s, read it
       score = Double.parseDouble(line)
    } else {
       ... skip or assign a default
       score = 0.0d;
    }

    line = "enter grade or s to skip".prompt()
    if ( !"s".equals(line) ) { it wasn't s, then read
      grade = line;
    } else { 
       .. skip or put default
      grade = "A"
    }