2016-07-07 39 views
2

我在unix shell中運行這個curl命令,它工作(見下文)。我能夠將返回的數據重定向到一個文件,但現在我想在我的代碼中處理數據,而不是在文件中浪費一堆空間。在Python中使用curl在Popen中使用

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) 

在這之後,theFile.stdout爲空。在curl命令中返回的數據應該是4000行(在shell中運行命令時驗證)。尺寸是否打破了文件.stdout?我在做別的事嗎?我試着使用:

out, err = theFile.communicate() 

,然後打印out變量,但仍然沒有

編輯:格式化和澄清

+2

爲什麼不使用'requests'庫?或者系統默認'urllib'? – SuperSaiyan

+1

相關:[爲什麼shell = True吃我的subprocess.Popen stdout?](http://stackoverflow.com/q/10661457/4279) – jfs

回答

2

您需要刪除shell=True

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

應該工作。

如果你這樣做shell=True,你應該傳遞一個字符串。否則,你實際做的是將這些參數-kaddr作爲參數傳遞給shell。所以如果你的外殼是sh,你在做什麼是sh 'curl' -k addr

0

Eugene's是一個直接回答你的問題,但我想我會添加一個使用requests庫,因爲它需要更少的代碼和更容易閱讀任何人需要看你的代碼(並已跨平臺的好處)。

import requests 

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

如果響應是JSON,可以自動將其轉換爲一個Python對象

print response.json() 
0

你可以像繩子把curl命令:

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

或者你可以刪除外殼參數:

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

或者您可以使用pycurl模塊直接使用libcurl庫並跳過整個額外的過程。