2016-07-07 4 views
2

このcurlコマンドをUNIXシェルで実行すると、以下のように動作します。私は返されたデータをファイルにリダイレクトすることができましたが、今度はファイル内にたくさんのスペースを浪費するのではなく、コード内のデータを処理したいのです。Popenでの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) 

この後、ファイル.stdoutは空です。 curlコマンドで返されるデータは、4,000行(シェルでコマンドを実行するときに確認される)のようなものでなければなりません。サイズはtheFile.stdoutを破っていますか?私は別の何か間違っているのですか?私が使用してみました:

out, err = theFile.communicate() 

、その後アウト変数を印刷するが、まだ何も

編集:書式設定と明確化

+2

なぜ 'requests'ライブラリを使用しないのですか?またはシステムのデフォルトの 'urllib'? – SuperSaiyan

+1

related:[なぜshell = Trueは私のサブプロセスを食べますか?](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をシェルに渡すことです。あなたのシェルがshなら、あなたがしていることはsh 'curl' -k addrです。

0

あなたの質問に直接答えてもらえますが、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ライブラリを直接使用し、追加のプロセス全体をスキップすることができます。

関連する問題