2016-05-24 8 views
0

Я новичок в Python. Я пытаюсь преобразовать ниже команду bash скрипта в Python, используя подпроцесс. Я не получаю никакого вывода и не вижу никаких сбоев при выполнении моего сценария Python.Преобразование команды curl в python

Это команда bash, которую необходимо портировать на Python.

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' 

Мой питон код:

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 stdout и print stderr ничего не печатает, хотя dev-objs/1 существует.

Когда я выполняю ту же команду, что и команда bash, она работает, и я вижу выход REST API.

Может ли кто-нибудь помочь мне в том, что здесь может быть неправильным? Благодаря

+0

преобразовать строку в список аргументов try shlex.split, а не str.split. –

+0

Просто любопытно; есть ли причина, по которой вы захотите выполнить 'curl' вместо использования' urllib'? – Dolda2000

+0

bash ужасно, и подпроцесс тоже невелик. Используйте библиотеку [запросов] (http://docs.python-requests.org/en/master/user/quickstart/) вместо 'curl' (и вместо' urllib'). –

ответ

3

Вы можете использовать requests:

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


import requests 

proxies = { 
    'https': 'https://lawn:[email protected]:443', 
} 

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

Я не думаю, что есть флаг -s для запросов, поскольку никаких данных не будут выводиться, если не печатать то, что возвращается с req.json() ,

Я думал, вы имели капитал U не u так все, что вам действительно нужно сделать, это использовать basic-authentication прохождения auth = (user, pass), установите verify=False согласно Brendans answer.

Почему ваш подпроцесс код не работает потому, что у вас есть какие-то аргументы процитированные как "'lawn:oldlawn!'", что вы хотите:

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() 
+0

Я искал синтаксис запросов, и когда я вернулся, вы разместили это: P (также обратите внимание, что, вероятно, лучше [настроить SSL-сертификат] (http://docs.python-requests.org/en/master/user/advanced/# ssl-cert-verification) как корень CA или что-то, а не забыть о проверке) –

+0

В чем заключается цель использования прокси-сервера? –

+0

@WayneWerner, да, это определенно было бы лучшим подходом, OP использовал -k, поэтому я просто реплицировал. –

1

Использование requests сделает ваш HTTP (S) запросов гораздо проще:

import requests 


response = requests.get('https://192.168.135.20:443/api/json/v2/types/dev-objs/1', 
         verify=False, auth=('lawn', 'oldlawn!')) 
print response.json() 
+0

Вам нужно 'verify = False' здесь –

+0

@WayneWerner Ах, да, вы правы. Благодарю. –

+0

Спасибо всем, используя shelx.split() разрешил мою проблему. – technewbie

Смежные вопросы