python exe 파일 실행시 failed to execute script 오류 해결하기

가상화폐|2021. 3. 7. 10:36
반응형

일단, pyinstaller를 삭제하고 다시 설치해 보겠습니다.

pip uninstall pyinstaller

다시 설치하기

pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip

다시 auto-py-to-exe 를 실행합니다.

하지만. 동일한 오류가 발생합니다. pyinstaller 버젼이나 설치오류와는 아무 관련이 없었습니다.

다시.. 여기 사이트를 참조하여 다시 해 보겠습니다.

In PyInstaller, Why Won't NumPy.Random.Common Load as a Module?

 

import pandas as pd 앞부분에 붉은색 부분 추가합니다.

# 추가한 부분
import numpy.random.common 
import numpy.random.bounded_integers 
import
 numpy.random.entropy

import pandas as pd

다음과 같이 다시 pyinstaller를 실행해 봅니다.

pyinstaller --icon=test.ico --onefile --noconsole -F -n goldcoin.exe -c --clean main.py
-F: 한 개의 파일로 만들기. 용량은 당연히 조금더 커진다. (없을 시 dll 파일들과 분리되어 폴더로 생성됨)
-n: 이름짓기. 이름은 바로 오른쪽에 기입 (없을 시 소스파일명과 동일한 파일이 생성됨)
--noconsole: exe파일 실행시 콘솔창 띄우지 않기
--onefile: import 된 라이브러리를 따로 생성하지 않고 exe 파일 안에 다 넣고 싶은 경우
--icon=test.ico: 실행파일의 아이콘을 바꾸고 싶다면 추가


D:\PycharmProject\BithumAPI\dist 여기에 goldcoin.exe파일이 잘 만들어져 있네요.

하지만.. 실행시에 다음과 같은 오류가 또... 

 

GUI 라이브러리를 사용할 때는 pyinstaller 후 생성된 .spec 파일을 수정해야 된다고 하네요.

(1) .spec 파일에서 라이브러리를 추가하고, coll 부분을 수정

(2) pyinstaller .spec

(3) .exe 파일 실행

 

함 해 보죠.. 

m.blog.naver.com/PostView.nhn?blogId=qbxlvnf11&logNo=221791248065&proxyReferer=https:%2F%2Fwww.google.com%2F

 

상세내용은 여기를 참조하라고 하네요..

kivy.org/doc/stable/guide/packaging-windows.html

 

다음은 main.spec의 내용입니다.

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None



a = Analysis(['main.py'],
             pathex=['D:\\PycharmProject\\BithumAPI'],
             binaries=[],
             datas=[('./TA_Lib-0.4.19-cp37-cp37m-win32.whl', '.')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='goldcoin.exe',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )

 

이번에는 수정한 spec파일을 pyinstaller 실행합니다.

pyinstaller --icon=.\image\goldcoin_1.ico --onefile --noconsole -F -n goldcoin.exe -c --clean main.spec

여전히 talib.stream 모듈을 찾을수 없다는 에러가 떠서,

python 소스에 추가해 주었습니다.

import talib
import talib.stream

 

이제 talib.stream오류는 해결되었나 봅니다.

다른 오류가 뜹니다.

KeyError: 'formatters'

 

원인을 보니, log config파일을 실행단계에서  logging.conf파일을 가져오지 못하는 오류인것으로 보입니다.

일반적으로 py파일을 실행할때는 아무 문제가 없던 부분입니다.

 

하기 붉은 색 부분을 os.path함수를 이용해서 명시적으로 path를 지정해 줍니다.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import logging.config
from datetime import datetime
import os

class Logging():
    def __init__(self, config_path='config/logging.conf', log_path='log'):
        folderPath3 = os.path.abspath(os.getcwd()) + '/config'
        if not os.path.isdir(os.path.abspath(os.getcwd()) + '/config'):

           os.makedirs(os.path.abspath(os.getcwd()) + '/config')
        folderPath3 = str(folderPath3)
        config_path = os.path.abspath(folderPath3 + str("\\logging.conf"))

        folderPath3 = os.path.abspath(os.getcwd()) + '/log'
        if not os.path.isdir(os.path.abspath(os.getcwd()) + '/log'):

           os.makedirs(os.path.abspath(os.getcwd()) + '/log')
        log_path = str(folderPath3)
   
        self.config_path = config_path
        self.log_path = log_path

하지만, 소용이 없어 보입니다.

결국, pyinstaller에서 exe 실행파일 만들때는 log용 formater는 사용할 수가 없을 것 같습니다.

결국 모든 log 파일용 format 설정정보와 함수는 모두 지운후에 다시 실행해 보니, 정상적으로 exe파일이 실행됩니다.

pyinstaller --icon=.\image\goldcoin_1.ico --onefile --noconsole -F -n goldcoin.exe -c --clean main.spec

추가로, goldcoin.exe가 죽으면 계속해서 끊임없이 다시 실행시켜줄 ParentTrader.exe파일도 만들었습니다.

pyinstaller --onefile --noconsole -F -n ParentTrader.exe -c --clean ParentTrader.py

ParentTrader.exe를 실행하니, 다음과 같은 command창이 뜨면서 main창이 뜹니다.

여기서 "빗썸코인거래 시작"버튼을 누르면, 빗썸으로 자동접속되면서 매수추천 및 자동매매가 시작됩니다.

폴더내의 전체 파일 및 하위폴더 구조입니다.

반응형

댓글()

auto-py-to-exe로 python exe 파일 만들기

카테고리 없음|2021. 3. 7. 09:19
반응형

python 코드를 exe 배포파일 만들때는 pyinstaller를 사용합니다만,

옵션들을 직접 알고 타이핑해야 하는 불편함이 있었습니다.

 

그런데, 오늘..

출처: https://iamaman.tistory.com/3289 [남성의 MATLAB LOG]

님의 덕분에 좋은 방법을 찾게 되었습니다.

 

아래와 같이 anaconda prompt에서 pip install을 통해서 auto-py-to-exe를 설치해 줍니다.

그다음, auto-py-to-exe를 실행시키면 됩니다.

그러면, 다음과 같이 팝업 윈도우 창에서 실행파일 만드는 명령을 줄 수 있습니다.

약 10분 후에 정상적으로 완료되었다는 메세지가 보입니다.

이번에는 exe파일이 정상적으로 실행될 수 있을까요? 

지금까지 계속 실패하고 있거든요. exe파일 실행해도 에러 메세지도 없이 실행이 안되었거든요...

 

OPEN OUTPUT FOLDER를 눌러서 가니,

main.exe파일이 정상적으로 만들어져 있습니다. 실행을 해 볼까요?

에고.. 역시 또 실패입니다. numpy.random.common 모듈을 못찾았다네요.. 흠..

이거 오류 찾아서 결과 다시 올리겠습니다.

반응형

댓글()

파이썬에서 Slack API를 통한 주식매매정보 보내기

반응형

안녕하세요?

 

오늘은 주식자동매매 구현시 자동매매 도중에 발생되는 정보나

Status, 추천종목정보, 자동매수 매도 결과를 자신의 Slack 메신저로 보내주기 위해

필요한 Slack API 설정 및 그 설정을 이용한 파이썬 코드, 

그리고, 그 결과 메세지가 전송된 결과 화면을 공유해 보고자 합니다.

 

1. slack API 설정화면

   하기 화면 메뉴에서 Bot User OAuth Access Token 값을 Copy합니다.

   여기서 token생성하는 과정은 다른 전문가님들의 가이드 메뉴 참조하시기 바랍니다.

   여기서는 생략하겠습니다. 

 

추가로, Scope도 추가 정의해 줘야 합니다.

slack bot에 access하는 application python에서 slack bot에 어떠어떠한 권한까지

가질수 있는지를 지정한다고 보시면 됩니다.

저는 channel읽기, chat에 글 올리기, 파일읽기 등 총 5가지 모두를 부여해 봤습니다.

 

2. Python slack.py 소스 코드

   우선 slack.py로 파이썬 코드를 분리했습니다.

   나중에 main 파이썬에서 from slack import *

   로 포함시키도록 하면 됩니다.

from slacker import Slacker

class Slack():
   def __init__(self):
       ############################################################
       # Slack API에서 "auto Traders" 
       # Installed App Settings
에서의 "OAuth Tokens for Your Team"
       #  >"Bot User OAuth Access Token"(Access Level: Workspace)
       ############################################################
       self.token = 'xoxb-1251878735248-1513295792086-k4wHoOdyjaWUsjXtVQL6JQeZ'

   def notification(self, pretext=None, title=None, fallback=None, text=None):
       attachments_dict = dict()
       attachments_dict['pretext'] = pretext
       attachments_dict['title'] = title
       attachments_dict['fallback'] = fallback
       attachments_dict['text'] = text

       attachments = [attachments_dict]

       slack = Slacker(self.token)
       slack.chat.post_message(channel='#gold-stock', text=None, attachments=attachments, as_user=None)

   Slack class내에 1번에서 copy한 token 값을 self.token에 저장하고,

   다른 class에서 notification 함수를 통해 호출할 수 있도록 정의합니다.

   

   다음은 main.py의 코드 일부입니다.

   매수 추천주를 골라서 slack으로 알려주는 기능입니다. 

from config.slack import *
...

class MyWindow(QWidget, metaclass=Singleton):
   def __init__(self, parent=None, **kwargs):
       super().__init__(parent, **kwargs)

      self.slack = Slack() # 슬랙 동작
   
  def ai_recommend_click(self):
      # 매수 추천주 확인
      market_status = self.get_recommend_items(stockCode, self.recommInterval, self.click_row)

      # 실제 매수 매도처리
      if market_status == "매수":
        self.slack.notification(pretext="(%s(%s)) 매수 추천종목" % (name, stockCode),
                                   t
itle="%s 자동매매 List에 추가했습니다. 로직No.(%s)" % (datetime.now().strftime("%Y-%m-%d %H:%M:%S"), str_decision_list),
                                   text="https://www.bithumb.com/trade/chart/" + stockCode + "_KRW")
      .
      .

 

이 부분이 slace에서 메세지로 받아보면 아래와 같은 메세지를 slack에서 자동으로 

받아볼 수 있습니다.

여기서 맨 마지막 URL Link를 누르면, 다음 화면으로 연결도 됩니다. ^^

 

이상으로 띄엄띄엄이긴 하지만, slack bot을 통해서

파이썬 자동매매 프로그램에서 종목을 추천한 결과를 slace 메세지로 보내고,

slack 에서 해당 메세지를 보고, 첨부된  url링크를 눌러서 

추가 상세정보도 확인할 수 있다는 걸 

간단한 예로 보여드렸습니다.

 

이상입니다.

반응형

댓글()

파이썬에서 텔레그램 챗봇 API를 통한 주식매매정보 보내기

AI주식자동매매|2021. 1. 24. 11:03
반응형

안녕하세요?

주식자동매매 프로그램을 만들고 나면, 추천종목정보나 체결정보를 메신저로 받아보고 싶으실텐데,

Slack이나 텔레그램봇을 이용하여 쉽게 구현이 가능했습니다.

 

이번에는 가장 쉬운, 텔레그램챗봇을 만들어서 추천종목을 공유하는 방법을 정리해 보겠습니다.

자동매매프로그램에서 텔레그램에 정보를 보내기 위해서 꼭 필요로 하는 정보는 Bot Token 및 Chat Id 입니다.

Telegram API 를 이용하여 Bot Token(발신인) 이 Chat Id(수신인) 으로 메시지를 보내는 개념입니다.

 

 

1. 모바일 텔레그램의 대화방 탭에서 BotFather를 검색합니다.

   

2. BotFather를 선택하면 안내문이 나타납니다.  대충 내용 확인하시고, /start를 입력해 줍니다.

   

3. 대화창에서 /newbot 를 입력하여 새로운 봇을 만듭니다.

3. name 과 username 을 입력합니다.

  이때 name 은 말 그대로 봇을 부르는 이름으로 내가 알아보기 쉽게 지으면 됩니다.

   (나중에 /setname 명령으로 수정할 수도 있으니 name은 가볍게 지으시면 됩니다.)

   username 은 일종의 id 와 같은 개념으로 반드시 bot 으로 끝나야하며(TetrisBot or tetris_bot), 기존에 텔레그램에 등     록되어있는 username 은 사용할 수 없으므로 신중히 생각해서 입력하시기 바랍니다. 중복되면 안됩니다.

저는 name과 username을 똑 같이 입력해 버렸네요. 귀찮아서.. ㅎㅎ

username까지 입력하면, 다음과 같이 HTTP API정보를 보내줍니다. 숫자:알파벳 내용으로 되어 있습니다.

이 값이 Token입니다. 보안을 유의해서 잘 보관해 둡니다. 

4. 이제 메시지의 발신인이 될 봇을 만들고 봇의 Token 값을 알았으니,

   메시지의 수신인이 될 나의 Chat Id 를 확인하셔야 합니다.

   브라우저 주소 입력창에 https://api.telegram.org/bot봇Token값/getUpdates 를 입력합니다.

   "봇Token값" 위치에 3번에서 확인받은 Token값을 모두 full로 입력합니다.

  그러면, 그림이 너무 작긴 하지만, ,"chat":{"id": 뒤의 숫자정보가 본인의 chat_id입니다.

 

5. 이제 대화를 시작해야 할 수 있습니다.

   앞서 봇을 만들었던 BotFather 와의 대화창에서 t.me/??????bot 를 누르면 아래와 같은 대화창이 뜨고

   여기서 반드시 START(또는 시작) 를 눌러 텔레그램봇과의 대화를 시작할 수 있습니다.

6. 이제 파이썬 프로그램에서 token정보와 chat id를 이용해서 주식정보를 보내보겠습니다.

   보안때문에 token정보와 chat id는 가상의 정보이니 참고 바랍니다.

   하기는 소스의 해당 부분만을 적었습니다.

   추천종목정보의 종목코드(종목명), 현재가, 목표가, 목표가 매매시 예상수익률 관련 정보와

   해당 주봉, 일봉, 5분봉 정보 chart를 보내는 예제입니다. 

import telegram
.
.
class 
Kiwoom(QAxWidget, metaclass=Singleton):
   def __init__(self, parent=None, **kwargs):
        super().__init__(parent, **kwargs)
        .
        .
 
        self
.token = "219999999:AAZZZZZZZzzzzzzzzzZZZZZZ9UI"
        self.bot = telegram.Bot(self.token)
   
   def call_show_canvas(self):
        .
        .
        .
        try:
            self.bot.sendMessage(chat_id=218888888, text="(%s)기준 매수추천 종목입니다. 실제 매수여부는 각자가 판단하셔 
                                                                           야 합니다
." % (recomm_interval))
            self.bot.sendMessage(chat_id=218888888, text="%s(%s) %s, 현재가:%s, 목표가:%s(%s프로)" %           
                                             (stockName
, stockCode, market_status, current_price, target_sell_price, target_sell_rate))
       except:
            self.logging.logger.debug('chat_id: {}; error: {}'.format('1440986979', 'Error while sending notification'))

       .
       .
       .
      try:
           self.bot.send_photo(chat_id=218888888, photo=open(pic, 'rb')) #
      except:
           pass

 

실제 프로그램을 실행시켜보면, 다음과 같이 정상적으로 텔레그램봇이 주식정보를 받는 모습을 확인하실 수 있습니다.

1월 24일 기준으로 효성첨단소재 종목을 매수하라고 하네요. 

187,000원에 매입하면, 목표가 233,000원에 매도하여 24.3%의 수익률을 낼 수 있다네요..  맞을까요? ㅎㅎ

(무조건 따라 하시면 안됩니다.. 아래 메세지 경고문 참조하시구요.. ^^)

 

이상입니다~~ 

반응형

댓글()

Anaconda Installers를 활용한 파이썬 설치 및 개발환경 설정

반응형

오늘 Anaconda 3.8 64bit버젼을 다시 설치를 하게되었는데,

32bit env환경에서 PyQt5 를 설치할 수가 없었습니다.

결국 해결은 했습니다만, 저처럼 고생하실 분들을 위해서 미리 적어둡니다.

혹시, 여기서 저와 같이 고생하시는 분들에게 도움이 된다면 좋겠습니다.

 

설치 오류났던 환경은 다음과 같습니다.

Windows10환경은 64bit 환경이라, 64-bit용 Anaconda를 설치하여 Python을 설치를 하게됩니다.

현재 최종버젼이 3.8버젼이라서, 이 버젼을 다운받아 설치를 했습니다.

주식 API를 사용하기 위해서는 32bit 가상환경을 만들어야만 하기에,

파이썬 버젼 3.8에 맞춰 가상환경을 만들었습니다.

>python -m pip install --upgrade pip

>set CONDA_FORCE_32BIT=1
>conda create -n py38_32 python=3.8 anaconda
>activate py38_32

문제는 여기서 부터 발생한것 같습니다.

추가로 pyqt5를 설치했는데.. 제대로 설치가 되지 않고, 오류가 계속 발생했습니다.

>pip install pyqt5
>pip install mpl_finance

 

오류유형1)

Could not find a version that satisfies the requirement PyQt5-sip

오류유형2)

DLL load failed when importing PyQt5

 

결국, 파이썬 python=3.8 을 사용한것이 문제인가 싶어서, python=3.7을이용했더니,

오류가 없어졌습니다.

결국, 정리하자면,

32bit env환경에서 Python 3.8버젼은 PyQt5와 호환되지 않는것 같다는 결론입니다.

1. env 삭제
>conda env remove -n py38_32

2. 폴더삭제
   C:\ProgramData\Anaconda3\envs\py38_32

3. env다시 생성
>set CONDA_FORCE_32BIT=1
>conda create -n py37_32 python=3.7 anaconda
>activate py37_32
>conda env list

>pip install pyqt5
>pip install mpl_finance

 

위 작업들은 anaconda prompt를 사용하여 설치를 했습니다.

추가로, 현재 설치된 파이썬의 버젼을 확인해 보겠습니다.

(py37_32) C:\Windows\system32>python -V
Python 3.8.5

파이선이 설치되어 있는 위치 확인하기

반응형

댓글()

키움 API호출시 한글깨짐 해결하기

카테고리 없음|2020. 11. 18. 07:54
반응형

어쩔 수 없이 영문 윈도에서 한글 언어 패치하여 사용할 경우,

하기와 같이 한글이 깨져서 보이는 경우가 있습니다.

이때는 키움증권 인증서로그인이 되지 않고,

opstater에서 에러가 걸려 더이상 로그인이 되지 않는 형상이 발생합니다.

 

제어판 > 국가 또는 지역 > 관리자 옵션 에서

"유니코드를 지원하지 않는 프로그램용 언어"를 한국어(대한민국)으로

설정한 후 다시 실행하면 됩니다..

반응형

댓글()

KOAStudio실행시 한글깨짐현상

카테고리 없음|2020. 11. 12. 23:58
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

No module named 'talib'

반응형

TA_Lib-0.4.19-cp37-cp37m-win32.whl
0.36MB

[파이썬] TA-LIB 파이썬 패키지 설치

ta-lib란?
주식 차트의 기술적 분석을 위한 200여 가지의 지표 함수를 제공하는 C 라이브러리인데, 파이썬으로 포팅되어있다.
– 공식홈페이지: http://ta-lib.org/
– 함수 목록: http://ta-lib.org/function.html
– Python 패키지 및 엑셀 플러그 인 제공
https://github.com/mrjbq7/ta-lib
http://mrjbq7.github.io/ta-lib/doc_index.html

설치로그:나의 오후를 잡아 먹은 삽질을 정리해보았다.
앞서 아나콘다4.2.0(파이썬3.7) 32비트 버전과 zipline이 설치된 상태에서

# 소스코드 컴파일하여 설치하는 방법(Install TA-Lib C Library on Windows 10)

http://timebird.egloos.com/7390887 

  1. Download and Unzip ta-lib-0.4.0-msvc.zip(https://github.com/mrjbq7/ta-lib)
  2. Move the Unzipped Folder ta-lib to C:\
  3. Download and Install Visual Studio Community 2015 또는 Visual C++ Build Tools
  4. Build TA-Lib Library
    4-1) 명령프롬프트 실행 [VS2015 x86 Native Tools Command Prompt]
    4-2) C:\ta-lib\c\make\cdr\win32\msvc 로 이동
    4-3) nmake 실행
  5. [Anaconda Prompt] 실행(관리자권한으로 실행 추천)
  6. pip install ta-lib
  7. 임포트시 RuntimeError: module compiled against API version 0xb but this version of numpy is 0xa 같은 에러가 나는 경우 numpy업그레이드(pip install numpy –upgrade)

# 비공식 윈도우용 바이너리로 설치하는 방법(Unofficial Windows Binaries for Python Extension Packages)

  1. https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib 로 이동
  2. c:\TA_Lib-0.4.21-cp37-cp37m-win32.whl 을 다운받는다(32비트  파이썬3.7용 TA-Lib)
  3. [Anaconda Prompt] 실행
  4. pip install c:\TA_Lib-0.4.21-cp37-cp37m-win32.whl

 

반응형

댓글()