2017-09-07 9 views
1

私は正常にbashスクリプトで次のコマンドを使用してドッカーを得ることができます:curl -O https://download.docker.com/mac/stable/Docker.dmg > ./Docker.dmgcURLのはPythonでサブプロセスを介して動作しない3

は、今私はPythonで同じことを実行したい:しかし

from subprocess import call 
call(["curl", "-O", "https://download.docker.com/mac/stable/Docker.dmg", ">", "./Docker.dmg"]) 

それを実行しているとき、私はこのエラーと会っています:

% Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
100 123M 100 123M 0  0 25.0M  0 0:00:04 0:00:04 --:--:-- 27.2M 
curl: (6) Could not resolve host: > 
curl: (7) Failed to connect to port 80: Connection refused 

は、それはまったく同じbashスクリプトでなければなりませんが、それはPythonスクリプトを介して動作しません。私はそれが動作するために何かを追加する必要がありますか?ポート?

+0

奇妙な。 。> "Docker.dmg"の中に ">"を入れても、それは意図したとおりに動作しますが、 '' curl:(6)Could not resolve host:> 'というエラーを投げますか?本当に奇妙です。 Python 3.6.2 – cbll

答えて

3

はたぶん、この一時的な解決策は、次のことに役立ちます。ここでは

call(["curl -O https://download.docker.com/mac/stable/Docker.dmg > ./Docker.dmg"], shell=True) 

は、引数がどのように動作するかシェルa good explanationです。

UPDATE:

事が>と出力のリダイレクトに使用すると、シェルが必要だということです。サブプロセスでこれを行うには、stdout引数を使用します。

f = open('docker.dmg', 'w') 
call(["curl", "-O", "https://download.docker.com/mac/stable/Docker.dmg"], stdout=f) 
1

curl's man pageこの-Oオプションについて言いたいことがあります。

-O、--remote-名

書き込み出力にリモートファイルと同じ名前のローカルファイル。 (リモートファイルのファイル部分のみが使用され、パスは切り捨てられます)

ファイルは現在の作業ディレクトリに保存されます。ファイルを別のディレクトリに保存する場合は、このオプションを指定してcurlを呼び出す前に、現在の作業ディレクトリを変更してください。

保存に使用するリモートファイル名は、指定されたURLから抽出され、それ以外のものは存在しません。既に存在する場合は上書きされます。 [...]このように

を、それはあなたのファイルではなく、Pythonのを書いているものcurl実際には自分自身だし、さらに標準出力をリダイレクトして読むためのすべての必要はありません。あなたのコードは、このようにだけ、このように単純化することができます。

from subprocess import call 
call(["curl", "-O", "https://download.docker.com/mac/stable/Docker.dmg"]) 

これはDocker.dmgファイルをダウンロードし、現在のディレクトリに書き込みます。現在のディレクトリにある既存のDocker.dmgファイルがすでに存在する場合は上書きします。

関連する問題