2

FTP サーバーからファイルをダウンロードして圧縮し、FTP サーバーのアップロード フォルダーにアップロードするプログラムを作成する必要があります。私の古いコードは良いのですが、講師から、コードを論理関数に整理するように要求されました。コードを整理した後、実行されませんでした。これは完全に実行される古いコードです。

import os
import upload
import download
import zipfile
import ConfigParser
import ftputil
import shutil
import time


def main():

    #create a folder Temp on drive D:\ for later use
    path = r'D:\Temp'
    os.makedirs(path)

    #parse all the  values at configuration file named config.ini
    config = ConfigParser.ConfigParser()
    config.readfp(open('config.ini'))
    server = config.get('main', 'Server')
    username = config.get('main', 'Username')
    password = config.get('main', 'Password')
    uploads = config.get('main', 'Upload folder')
    downloads = config.get('main', 'Download folder')

    #connect to ftp
    ftp = ftputil.FTPHost(server, username, password)

    dirlist = ftp.listdir(downloads)

    #download all files from download folder to the created temp folder
    for list in dirlist:
        ftp.chdir(downloads)
        target = os.path.join(path, list)
        ftp.download(list, target)

    #zipping files
    absolute_path = r'D:\Temp'
    dirlist = os.listdir(absolute_path)
    filepath = r'D:\Temp\part2b.zip'
    zip_name = zipfile.ZipFile(filepath, 'w')
    for list in dirlist:
        get_file = os.path.join(absolute_path, list)
        zip_name.write(get_file, 'part2b\\' + list)

    #upload the zipfile named project2.zip to upload folder at ftp
    ftp.chdir(uploads)
    ftp.upload(filepath, uploads + '/part2b.zip')
    ftp.close()

#close the zipfile to remove the temp folder
    zip_name.close()

    #message
    print "Successfully uploaded all files in the upload folder"
    print ""
    print "this will close in 5 seconds....."


#delete temp folder
    shutil.rmtree(path, 'true')
    time.sleep(5)


if __name__ == '__main__':
    main()

そして、これは新しい整理コードですが、うまく動作しませんでしたが、Python コマンド ラインですべての機能を試してみると、問題ありません。ここで何が問題なのかわかりません:

import os
import zipfile
import ConfigParser
import ftputil
import shutil
import time
import tempfile



def dl_function(source_folder, target_folder):
    dirlist = ftp.listdir(source_folder)
    for list in dirlist:
        source = os.path.join(source_folder, list)
        target = os.path.join(target_folder, list)
        ftp.download(source, target)

def zip_function(temp_folder):
    dirlist = os.listdir(temp_folder)
    filepath = os.path.join(temp_folder, 'project2b.zip')
    zip_name = zipfile.ZipFile(filepath, 'w')
    for list in dirlist:
        get_file = os.path.join(temp_folder, list)
        zip_name.write(get_file, 'part2b\\' + list)

def upload_function(target_folder):
    ftp.upload(filepath, target_folder + '/part2b.zip')


def main():

    temp_folder = tempfile.mkdtemp()

    #parse all the  values at configuration file named config.ini
    config = ConfigParser.ConfigParser()
    config.read(open('config.ini'))
    server = config.get('main', 'Server')
    username = config.get('main', 'Username')
    password = config.get('main', 'Password')
    uploads = config.get('main', 'Upload folder')
    downloads = config.get('main', 'Download folder')

    ftp = ftputil.FTPHost(server, username, password)

    try:

        dl_function(downloads, temp_folder)
        zip_function(temp_folder)
        upload_function(uploads)

    finally:
        ftp.close() 
        zip_name.close()        

    print "This will close in 5 seconds"

    #delete temp folder
    shutil.rmtree(temp_folder, 'true')
    time.sleep(5)

if __name__ == '__main__':
    main()
4

2 に答える 2

3

これは、アプリケーションでロギングを使用する方法の素晴らしい例です。通常、問題が発生した場合、2 つの方法でデバッグできます

  • デバッガーをアタッチする
  • いくつかの詳細なログを見てください

デバッガーが常に手元にあるとは限らないため、デプロイされたコードには後者の方がはるかに適しています。

pydocs ページのログ情報を見てください。コードに次を追加します:-

import os
import zipfile
import ConfigParser
import ftputil
import shutil
import time
import tempfile
import logging



def dl_function(source_folder, target_folder):
    logging.trace("Running dl_function")
    dirlist = ftp.listdir(source_folder)
    logging.trace("Got a dirlist")
    for list in dirlist:
        logging.trace("Running running for item " + list + " in dirlist")
        source = os.path.join(source_folder, list)
        logging.trace("Setting source to " + source)
        target = os.path.join(target_folder, list)
        logging.trace("Setting target to " + source)
        logging.trace("Attempting FTP download from " + source + " to " + target)
        ftp.download(source, target)
        logging.info("File downloaded from FTP")

...
...
...

if __name__ == '__main__':
    logging.info("Starting downloading application")
    main()

ロギングで最も重要な部分は、ロギングを適切に分割することです。そのため、正しいレベル ( DebugInfoWarningError)を使用しますCriticalpydocs page にチュートリアルがあります。

ログの出力を見ると、プログラムの実行プロセスがどこまで進み、どこで停止しているかを確認し、1 行または 2 行に絞り込むことができます。

于 2012-07-02T10:06:58.517 に答える
1

あなたupload_functiondl_function両方が未定義の変数 ( ftpand filepathinupload_functionftpin dl_function) を使用しようとしています。

また、実際に所属する必要zip_name.close()のある finally ブロックにも呼び出しがあります (これには独自の try/finally ブロックが必要です)。mainzip_function

wrt/ エラー メッセージの場合、コマンド ライン ウィンドウからスクリプトを実行して、トレースバックとエラー メッセージ全体を確認する必要があります。

まったく関係ありませんが、命名を改善できます (つまり、「dl_function」ではなく「download_files」)...

于 2012-07-02T10:30:24.893 に答える