簡體   English   中英

cURL在Python 3中無法通過子進程工作

[英]cURL doesn't work through subprocess in Python 3

我可以在bash腳本中使用以下命令成功獲取Docker: curl -O https://download.docker.com/mac/stable/Docker.dmg > ./Docker.dmg

現在,我想在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腳本工作。 我是否應該增加一些功能使其工作? 港口?

也許此臨時解決方案可以幫助您:

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

這是一個很好的解釋 ,shell參數如何工作。

更新:

關鍵是要使用>進行輸出重定向,您需要shell。 為此,請使用stdout參數:

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

curl的手冊頁上有關於-O選項的說明:

-O,-遠程名稱

將輸出寫入本地文件,例如我們獲得的遠程文件。 (僅使用遠程文件的文件部分,路徑被切斷。)

該文件將保存在當前工作目錄中。 如果要將文件保存在其他目錄中,請確保在使用此選項調用curl之前更改當前工作目錄。

用於保存的遠程文件名是從給定的URL中提取的,沒有別的,如果已經存在,它將被覆蓋。 [...]

因此,實際上, curl本身就是在編寫文件,而不是Python,並且根本不需要進一步重定向和讀取stdout。 因此,您的代碼可以簡化為:

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

這將下載Docker.dmg文件並將其寫入當前目錄。 請注意,如果已經存在,它將覆蓋當前目錄中的現有Docker.dmg文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM