3

私はftplibを使用するftpプログラムを持っており、過去2日間、retrbinaryとstorbinaryのプログレスバーを実装する方法を見つけようとしていました。プログレスバー2.3モジュールを使用しようとしていますが、それを結び付けることができませんでした。これは、コールバック関数がどのように機能するかについての誤解が原因である可能性があります。とにかくここに私が持っているものがあります。

import progressbar
import ftplib


ftp = ftplib.FTP()
ftp.connect("host", "port")
ftp.login("user", "pwd")


widgets = ['Downloading: ', Percentage(), ' ', Bar(marker=RotatingMarker()),
       ' ', ETA(), ' ', FileTransferSpeed()]
pbar = ProgressBar(widgets=widgets, maxval=1024).start()

def callback(p):
    for i in range(1024):
        pbar.update(10*i+1)
        pbar.finish()

ftp.storbinary("STOR iTunesSetup.exe", open("iTunesSetup.exe"), callback, blocksize=1024)

これは私がこれを試した多くの方法の1つにすぎませんが、このエラーが発生します。

Traceback (most recent call last):
  File "progrbar.py", line 7, in <module>
    ftp.connect("host", "port")
  File "/usr/lib/python2.7/ftplib.py", line 132, in connect
    self.sock = socket.create_connection((self.host, self.port), self.timeout)
  File "/usr/lib/python2.7/socket.py", line 553, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
socket.gaierror: [Errno -8] Servname not supported for ai_socktype

このコールバックがなくても、ftpサーバーは問題なく動作し、ダウンロードするのに十分なスペースがあると言えます。誰かが私にいくつかのポインタを与えることができれば、私はそれをいただければ幸いです。

4

1 に答える 1

6

将来の訪問者のために、これは私がそれをした方法です...

def handleupload(self, block):
    self.pbar.update(self.pbar.currval+len(block))

def upload(self):
    try:
        if os.path.getsize(self.filename) == 0:
            print "%s 0 bytes passing..." % self.filename
        else:
            print "Uploading %s-%d-bytes" % (self.filename, self.ftp.size(self.filename))
            self.pbar=ProgressBar(widgets=[FileTransferSpeed(),' ', Bar(marker=RotatingMarker()), ' ', 
                                                    Percentage(),' ', ETA()],    maxval=os.path.getsize(self.filename)).start()
            self.ftp.storbinary("STOR " + self.filename, open(self.filename), 
                                                        callback = s.handleupload, blocksize = 1024)
            self.pbar.finish() 
            print "Finished"
    except (error_perm, error_temp, Exception), self.exc:
        print self.exc
于 2012-07-26T19:17:05.097 に答える