Ошибка отслеживания при использовании Watchdog на Python - PullRequest
0 голосов
/ 08 июля 2020

Я пытаюсь создать сценарий, который отправляет электронное письмо, как только обнаруживается, что я копирую файл в указанную папку, используя некоторые части кода, которые я нашел при исследовании inte rnet, и теперь я застрял с этой ошибкой.

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import os.path

class Watcher:
    DIRECTORY_TO_WATCH = "/Documents/ReportesSemanales"

    def __init__(self):
        self.observer = Observer()

    def run(self):
        event_handler = Handler()
        self.observer.schedule(event_handler, self.DIRECTORY_TO_WATCH, recursive=True)
        self.observer.start()
        try:
            while True:
                time.sleep(5)
        except:
            self.observer.stop()
            print ("Error")

        self.observer.join()


class Handler(FileSystemEventHandler):

    @staticmethod
    def on_any_event(event):
        if event.is_directory:
            return None
        elif event.event_type == 'created':
            # Take any action here when a file is first created.
                def send_email(email_recipient,
               email_subject,
               email_message,
               attachment_location = ''):

                    email_sender = 'MyUser@domain.com'

                    msg = MIMEMultipart()
                    msg['From'] = email_sender
                    msg['To'] = email_recipient
                    msg['Subject'] = email_subject

                    msg.attach(MIMEText(email_message, 'plain'))

                    if attachment_location != '':
                        filename = os.path.basename(attachment_location)
                        attachment = open(attachment_location, "rb")
                        part = MIMEBase('application', 'octet-stream')
                        part.set_payload(attachment.read())
                        encoders.encode_base64(part)
                        part.add_header('Content-Disposition',
                                        "attachment; filename= %s" % filename)
                        msg.attach(part)

                    try:
                        server = smtplib.SMTP('smtp.office365.com', 587)
                        server.ehlo()
                        server.starttls()
                        server.login('MyUser@domain.com', 'MyPassword')
                        text = msg.as_string()
                        server.sendmail(email_sender, email_recipient, text)
                        print('email sent')
                        server.quit()
                    except:
                        print("SMPT server connection error")
                    return True

                send_email('MyUser@hotmail.com',
                        'Happy New Year',
                        'We love Outlook', 
                        '/ReportesSemanales/Bitacora-Diaria.xlsx')
                print("Received created event - %s." % event.src_path)
        elif event.event_type == 'modified':
            # Taken any action here when a file is modified.
            print("Received modified event - %s." % event.src_path)


if __name__ == '__main__':
    w = Watcher()
    w.run()

Я уже установил сторожевой таймер api, и когда я запускаю скрипт, я получаю сообщение об ошибке в терминале:

Traceback (most recent call last):
  File "SendEmail.py", line 90, in <module>
    w.run()
  File "SendEmail.py", line 22, in run
    self.observer.start()
  File "C:\Users\MyUser\AppData\Local\Programs\Python\Python38-32\lib\site-packages\watchdog\observers\api.py", line 260, in start
    emitter.start()
  File "C:\Users\MyUser\AppData\Local\Programs\Python\Python38-32\lib\site-packages\watchdog\utils\__init__.py", line 110, in start
    self.on_thread_start()
  File "C:\Users\MyUser\AppData\Local\Programs\Python\Python38-32\lib\site-packages\watchdog\observers\read_directory_changes.py", line 66, in on_thread_start
    self._handle = get_directory_handle(self.watch.path)
  File "C:\Users\MyUser\AppData\Local\Programs\Python\Python38-32\lib\site-packages\watchdog\observers\winapi.py", line 307, in get_directory_handle
    return CreateFileW(path, FILE_LIST_DIRECTORY, WATCHDOG_FILE_SHARE_FLAGS,
  File "C:\Users\MyUser\AppData\Local\Programs\Python\Python38-32\lib\site-packages\watchdog\observers\winapi.py", line 113, in _errcheck_handle
    raise ctypes.WinError()
FileNotFoundError: [WinError 3] The system cannot find the path specified.

Как я могу решить эту проблему?

Технические характеристики:

ОС: Windows 10 Python Версия: Python 3.8.3 Редактирование: Visual Studio

1 Ответ

0 голосов
/ 08 июля 2020

Эта строка:

FileNotFoundError: [WinError 3] The system cannot find the path specified.

Означает именно то, что он говорит: где-то во время выполнения сценария python один из путей, указанных вами в коде, не был найден.

Это обычно вызвано опечатками в определениях путей. В вашем случае это может быть вызвано ошибочным использованием в пути косой черты (/) вместо обратной косой черты (\). В то время как прямые косые черты используются в системах Linux / UNIX, Windows использует обратные косые черты.

Попробуйте изменить эту строку:

DIRECTORY_TO_WATCH = "/Documents/ReportesSemanales"

на эту:

DIRECTORY_TO_WATCH = "\Documents\ReportesSemanales"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...