2012-03-08 3 views
2

Привет Я пытаюсь создать FTP-сервер и помочь развитию, которое я использую pyftpdlib. Я хотел бы сделать некоторые операции с файлами, если пользователь загружает определенный файл, но иногда он вызывает исключение, и я действительно не знаю, почему.Почему мой код вызывает исключение?

я написал свой собственный обработчик в pyftpdlib после этого урока: http://code.google.com/p/pyftpdlib/wiki/Tutorial#3.8_-_Event_callbacks

Но что-то идет ужасно неправильно иногда, когда пользователь загружает файл журнала (который я намерен делать некоторые операции с файлами на), и я не очень понять почему. У меня есть другой класс, который в основном читается из файла конфигурации, и сообщение об ошибке говорит, что он не может найти раздел FTP. Но это странно, потому что я, очевидно, имею его в своем файле конфигурации, и он работает иногда отлично.

Может возникнуть эта ошибка, потому что у меня есть два объекта «Соединение»? Это единственное, что у меня есть, поэтому я был бы очень рад, если бы кто-нибудь мог объяснить, что происходит. Вот мой код, который смущается (Nevermind чек file.name, потому что был совсем недавно добавлен):

class ArchiveHandler(ftpserver.FTPHandler): 

def on_login(self, username): 
    # do something when user login 
    pass 

def on_logout(self, username): 
    # do something when user logs out 
    pass 


def on_file_sent(self, file): 
    "What to do when retrieved the file the class is watching over" 
    attr = Connection() 
    if attr.getarchive() == 'true': 
     t = datetime.now() 
    if file.name == "log.log": 

      try: 
       shutil.copy2(file, attr.getdir() + ".archive/" + str(t.strftime("%Y-%m-%d_%H:%M:%S") + '.log')) 
      except OSError: 
       print 'Could not copy file' 
       raise 

     if attr.getremain() == 'false': 
       try: 
        os.remove(file) 
       except OSError: 
        print 'Could not remove file' 
        raise 

Полный источник: http://pastie.org/3552079

Источник конфиг-файла: http://pastie.org/3552085

Edit-> (и, конечно, ошибка):

[root]@85.230.122.159:40659 unhandled exception in instance <pyftpdlib.ftpserver.DTPHandler object at 0xb75f49ec> 
Traceback (most recent call last): 
    File "/usr/lib/python2.6/asyncore.py", line 84, in write 
    obj.handle_write_event() 
    File "/usr/lib/python2.6/asyncore.py", line 435, in handle_write_event 
    self.handle_write() 
    File "/usr/lib/python2.6/asynchat.py", line 174, in handle_write 
    self.initiate_send() 
    File "/usr/lib/python2.6/asynchat.py", line 215, in initiate_send 
    self.handle_close() 
    File "/usr/local/lib/python2.6/dist-packages/pyftpdlib/ftpserver.py", line 1232, in handle_close 
    self.close() 
    File "/usr/local/lib/python2.6/dist-packages/pyftpdlib/ftpserver.py", line 1261, in close 
    self.cmd_channel.on_file_sent(filename) 
    File "ftp.py", line 87, in on_file_sent 
    File "ftp.py", line 12, in __init__ 
    File "/usr/lib/python2.6/ConfigParser.py", line 311, in get 
    raise NoSectionError(section) 
NoSectionError: No section: 'FTP Section' 
+0

Извините, отредактировано. Забыл, что за секунду – Ms01

+0

Вы можете напрямую создать объект 'Connection'? – Magnus

ответ

0

Проблема в этом случае заключалась в том, что, читая файл, он оставил файл открытым.

я изменил это, и это работает намного лучше:

config = ConfigParser.RawConfigParser() 
    fp = open('config.cfg') 
     config.readfp(fp) 

А потом, когда я закончил читать в конструкторе я добавляю:

#Close the file 
fp.close() 

И вуаля, вы можете открыть, сколько объекты класса, которые вы хотите, и он не будет показывать никаких ошибок. :)

+1

Вы должны ознакомиться с оператором ['with'] (http://docs.python.org/reference/compound_stmts.html#with), который автоматически обрабатывает закрытие файлов, даже если исключение пока чтение файла. – Chris

3

проблема в секунду вы не включили. Это говорит

File "ftp.py", line 12, in __init__ 
    File "/usr/lib/python2.6/ConfigParser.py", line 311, in get 
    raise NoSectionError(section) 
NoSectionError: No section: 'FTP Section' 

Так с первой линии, мы знаем, что все, что находится на линии 12 из ftp.py является проблемой (так как все ниже, что это не наш код, поэтому мы считаем, что это правильно).

Line 12 это:

self.ip = config.get('FTP Section', 'hostname') 

И сообщение об ошибке говорит: "Нет раздела:" FTP раздел".

Исходя из этого, мы можем предположить, что в файле конфигурации есть ошибка (что у нее нет «раздела FTP»).

Вы указываете правильный файл конфигурации? Это в том же каталоге, из которого вы запускаете скрипт? Будучи в той же папке, что и скрипт, будет не работать, это должна быть папка, в которой вы запускаете скрипт от.

Я думаю, что это проблема, вы испытываете, так как в соответствии с the documentation:

Если ни один из указанных файлов не существует, то экземпляр ConfigParser будет содержать пустой набор данных.

Вы можете подтвердить это, попробовав файл open.

+0

Я вполне уверен, что я использую правильный конфигурационный файл, и он находится в той же папке, в которой находится и работает сценарий. – Ms01

+0

Я пошел и попытался открыть файл, и он работал как ожидалось: Ms01

+0

@cubsink И вы запускаете скрипт из папки, в которой он находится (не нравится 'python some/path/ftp.py', просто' python ftp.py')? Попробуйте 'открыть файл, а затем с помощью' readfp() '. Кроме того, вы можете попробовать «напечатать» возвращаемое значение из 'read()'. Он должен печатать имена файлов, которые он мог проанализировать. –

Смежные вопросы