2010-01-13 91 views
1

我正在使用此代碼從我的Windows機器上傳myfile.txt到FTP服務器。在upoad腳本刪除我的本地機器上的文件(我沒有刪除它在FTP上)。Python的ftplib STOR可靠嗎?

try: 
    ftp = FTP(ftp.host.com) 
    ftp.login(your_username, your_password) 
    file = open(myfile.txt, "rb") 
    ftp.storbinary('STOR myfile.txt', file) 
    print 'STORing File now...' 
    ftp.quit() 
    file.close() 
    subprocess.Popen('del myfile.txt', shell=True) 
    print 'File deleted' 
except all_errors: 
    print 'An error occured' 

此代碼運行,但它不可靠!在每次〜10次上傳時,我的腳本在存儲文件時掛起。

print 'STORing File now...' # So I just get 'STORING File now...' 

的文件不是很大,應該在幾秒鐘內被上傳,但我往往要等一兩個小時,然後才引發異常:

print 'An error occured' 

如果該異常是拋出「較早」,這將是很好的,所以我可以重新開始上傳(例如在一個while循環中)。因爲我需要儘快上傳這個文件,所以我需要更快地上傳文件(我不想等待拋出異常這麼長時間)

第二個問題:有時發生這種情況:文件已成功上傳,該腳本無法刪除我的本地計算機上的文件,因爲'其他進程已經訪問它'< - 我認爲ftplib沒有'發佈'該文件。我能做些什麼來防止這種情況發生?

我正在尋找更好/可靠的簡單文件上傳解決方案。任何人有想法? 謝謝!

+0

我應該使用windows的ftp.exe(使用子進程調用)執行整個文件上傳嗎? – creativz 2010-01-13 17:02:59

回答

1

爲了得到異常的早期,使用socket.setdefaulttimeout:例如,

import socket 
socket.setdefaulttimeout(20.0) 

會給你一個例外,如果一個插座即可封鎖,持續20秒。

要從您的Pyton腳本中刪除文件,請使用os.unlink - 比單獨處理del要好得多。

+0

感謝os.unlink信息:> 因此,只需簡單地複製/粘貼您的代碼導入套接字; socket.setdefaulttimeout(20.0)它應該工作? – creativz 2010-01-13 17:28:53

+0

@creativz,如果用「work」表示「如果套接字阻塞20秒會引發異常」,是的,這正是它應該做的。 – 2010-01-13 18:53:28

+0

好的,所以這個異常將會在我現有的'except'中拋出。我會測試它。順便說一句,我修改我的除了: ,除了all_errors作爲e: print str(e) – creativz 2010-01-13 19:00:16

2

不要使用子掏出來刪除文件 - 將os.unlink通話將允許您便攜做到這一點現在(在shutil庫的空白填補時OS失敗)

,你是用愚蠢的打印語句來吞噬錯誤 - 從異常中獲得回溯,從而爲您提供大量線索。但是,您的問題很可能與套接字超時問題有關 - 要麼您沒有運行被動FTP,要麼服務器配置錯誤,並給您一個無效的被動連接端口號(防火牆阻止)。

+0

所以與套接字超時張貼(亞歷克斯Martelli)我應該能夠處理這個問題。謝謝! – creativz 2010-01-13 17:07:05

2

這個怎麼樣

def upload(ftp, filename): 
    ftp.storbinary("STOR " + filename, open(filename, "rb"), 1024) 
try: 
    ftp = FTP("ftp.host.com") 
    ftp.login(your_username, your_password) 
except Exception,e: 
    print e 
else: 
    file = open("myfile.txt", "rb") 
    print 'STORing File now...' 
    try: 
     upload(ftp,file) 
    except Exception,e: 
     print e 
    else: 
     ftp.quit() 
     file.close() 
     try: 
      os.remove("myfile.txt") 
     except Exception,e: 
      print e 
     else: 
      print 'File deleted' 

記住,Python有它自己的文件中刪除模塊。不要不必要地調用系統del