2016-07-07 17 views
2

Ich führe diesen Curl-Befehl in der Unix-Shell und es funktioniert (siehe unten). Ich konnte die zurückgegebenen Daten in eine Datei umleiten, aber jetzt möchte ich die Daten in meinem Code verarbeiten, anstatt eine Menge Speicherplatz in einer Datei zu verschwenden.Verwenden von Curl in Popen in Python

curl -k -o outputfile.txt 'obfuscatedandVeryLongAddress' 
#curl command above, python representation below 
addr = "obfuscatedandVeryLongAddress" 
theFile = subprocess.Popen(["curl", "-k", addr], stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True) 

Danach ist theFile.stdout leer. Die im Befehl "curl" zurückgegebenen Daten sollten etwa 4.000 Zeilen umfassen (überprüft, wenn der Befehl in der Shell ausgeführt wird). Bricht die Größe theFile.stdout? Mache ich etwas anderes falsch? Ich habe versucht, mit:

out, err = theFile.communicate() 

und dann den Druck der aus variabel, aber immer noch nichts

edit: Formatierung und Klärung

+2

Warum verwenden Sie nicht die Bibliothek 'requests'? Oder Systemstandard "urllib"? – SuperSaiyan

+1

verwandt: [Warum ist Shell = True essen mein Subprozess.Popen stdout?] (Http://stackoverflow.com/q/10661457/4279) – jfs

Antwort

2

Sie müssen shell=True entfernen.

theFile = subprocess.Popen(["curl", "-k", addr], stdout = subprocess.PIPE, stderr = subprocess.PIPE)

Sollte funktionieren.

Wenn Sie shell=True tun, sollten Sie eine Zeichenfolge übergeben. Andernfalls werden die Argumente -k und addr als Argumente an die Shell übergeben. Also, wenn Ihre Shell sh ist, was Sie tun, ist sh 'curl' -k addr.

0

Eugene's ist eine direkte Antwort auf Ihre Frage, aber ich dachte, ich würde eine auf die requests-Bibliothek hinzufügen, da es weniger Code benötigt und für jeden leserfreundlich ist, der Ihren Code ansehen muss (und hat der Vorteil plattformübergreifend zu sein.

import requests 

response = requests.get('longaddress', verify=False) 
print response.text 

Wenn die Antwort json ist, können Sie es zu einem Python-Objekt

print response.json() 
0

können Sie die curl Befehl automatisch umwandeln kann wie in einem String setzen:

theFile = subprocess.Popen('curl -k {}'.format(addr), stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True) 

Oder können Sie Entfernen Sie das Shell-Argument:

theFile = subprocess.Popen(["curl", "-k", addr], stdout = subprocess.PIPE, stderr = subprocess.PIPE) 

Oder Sie können das pycurl-Modul verwenden, um die libcurl-Bibliothek direkt zu verwenden und den gesamten zusätzlichen Prozess zu überspringen.

Verwandte Themen