예제 코드를 가지고 PySide6를 실행하려고 보니 

 

Process finished with exit code -1073741819 (0xC0000005)

 

이런 에러가 나는게 아닌가?

 

문제는 Pyside6 버전 문제였다.

 

2021.11.17 아나콘다 가상환경에서 설치시 6.2.1 버전의 pyside6를 설치했는데 에러 발생

 

과거에 사용하던 버전인 6.0.4로 다운그레이드 하니깐 된다.

아니 AVD(=Android Virtual Device)가 왜 실행이 안되는거야?!!!

 

찾아보니...

 

....???

VT-x is disabled in BIOS..??

 

그럼 BIOS 창에서 해결해줘야겠네..?

 

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

 

[Android]안드로이드 스튜디오 VT-x is Disabled in The Bios Android Studio 오류 해결법!

안드로이드에서 이런 문제가 발생했을때는 Enable VT-x BIOS에서 해결해야합니다. 참고로 저는 윈도...

blog.naver.com

블로그 아무거나 하나 찾아서 해보자.

 

결과적으론

Intel Virtualization Technology을 Enabled 시켜주면 된단다.

새로운 컴퓨터에서 Android Studio를 설치하고 문제를 해결하려고 하다보니 

Failed to install the following Android SDK packages

이런 오류가 발생하면서 컴파일이 안되는 것이 아닌가...

 

왜 이런걸까 확인해보니 License 문제라는데......

 

 

이 글대로 해보려 하니 나는 licenses 디렉토리가 없네??

 

그래서 확인해보니 

저 Google Play Licensing Library가 있어야 한댄다.

 

설치하고 나니 'Android SDK Location' 에 licenses 디렉토리가 생겨있더라.

 

뾰로롱

그 후에 다시 프로젝트를 컴파일 해보니 빌드 Success~~

오류 메세지 

Incorrect credentials. Request response: 401 Unauthorized

다른 컴퓨터에서 프로젝트를 불러올 일이 있어서 새로 Android Studio를 설치하고, Github 계정과 연동을 하려고 하니...

 

응?

 

검색을 해보니....

토큰으로 해봐라, git을 깔아라 등등...

 

하나씩 해보자.

 

참고로 Android Studio 버전은 4.1.1이다.

 

1. 토큰으로 하기

[Settings] -> [Developer Settings] -> [Personal Access Token]

에서

repo, gist, workflow를 체크하고 토큰을 만든 다음 로그인을 해봐도... 동일한 에러가 발생한다.

 

2. git 깔아보기

안된다 ㅋㅋㅋ

 

3. Stack Overflow 만만세

참고 : stackoverflow.com/questions/64964585/android-studio-github-login-incorrect-credentials-request-response-401-unauth

 

Android Studio GitHub Login "Incorrect credentials. Request response. 401 Unauthorized

I am having trouble logging in to my GitHub Account through Android Studio. I don't know why I am getting this error and there doesn't seem to be much about it out there. I made sure to have Git

stackoverflow.com

1번에서 git 토큰 설정할 때 아래와 같이 설정해주니 잘 된다.

참고 : goddaehee.tistory.com/205?category=367461

 

[스프링부트 (4)] Spring Boot DataBase 연동하기 (MariaDB, MyBatis, HikariCP)

[스프링부트 (4)] 스프링부트 DB 연동 (MariaDB, MyBatis, HikariCP) 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ SpringBoot DB 연동] 입니다. : ) 0. 들어가기 앞서 Spring Boot를 사용하면서 DB를연결하기..

goddaehee.tistory.com

github 링크 : github.com/Mistive/SpringBoot/commit/83f1586ce41d1d7c928d6d08bee1d09a111fc52c#diff-18ce661d1fc3d790f60910ad9c3c5192

 

MariaDB 적용하기 · Mistive/SpringBoot@83f1586

* MariaDB에 데이터 추가해서 출력해보기

github.com

▶커넥션풀(Connection Pool)이란?

- 풀(Pool) 속에 데이터베이스와의 연결(커넥션)을 미리 만들어두고, 데이터베이스에 접근 시 풀에 남아있는 커넥션 중 하나를 받아와 사용한 뒤 반환하는 기법이다.

- DBCP(=DataBasce Connection Pool)이라고도 한다.

JDBC(=Java Data Base Connection) 예제 코드

Connection conn = null;
PreparedStatement  pstmt = null;
ResultSet rs = null;

try {
    sql = "SELECT * FROM T_BOARD"

    // 1. 드라이버 연결 DB 커넥션 객체를 얻음
    connection = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);

    // 2. 쿼리 수행을 위한 PreparedStatement 객체 생성
    pstmt = conn.createStatement();

    // 3. executeQuery: 쿼리 실행 후
    // ResultSet: DB 레코드 ResultSet에 객체에 담김
    rs = pstmt.executeQuery(sql);
    } catch (Exception e) {
    } finally {
        conn.close();
        pstmt.close();
        rs.close();
    }
}

- 커넥션풀을 이용하여 미리 연결을 만들어놓기 때문에 효과적으로 DB 연결 및 자원 사용이 가능하다.


MariaDB & MyBatis Dependency 추가

pom.xml

        <!-- MariaDB -->
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

▶Driver 및 연결 정보 설정 추가

application.properties

spring.datasource.driverClassName= org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/test?characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=스키마계정
spring.datasource.password=비밀번호

▶testMapper.xml 생성 및 Dependency 추가

testMapper.xml

- 생성 경로 : resources/mybatis/test/testMapper.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo2.test.mapper.TestMapper">
    <select id="selectTest" resultType="com.example.demo2.test.vo.TestVo"> SELECT 'MISTIVE' AS NAME </select>
</mapper>

application.properties

spring.datasource.driverClassName= org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=1234

# testMapper.xml 위치 지정
# **은 하위 폴더 레벨에 상관없이 모든 경로를 뜻하며, *는 아무 이름이나 와도 된다는것을 뜻합니다.
mybatis.mapper-locations: mybatis/**/*.xml
더보기

추가 사항

application.properties

# mybatis 매핑 type을 짧게 쓰기 위한 설정
# mapper.xml에서 resultType을 지정할 때 com.god.bo.test.vo.TestVo 대신 TestVo로 간략히 할 수 있다.
mybatis.type-aliases-package:com.example.demo2.test.vo

을 추가할 경우

 

testMapper.xml에서 resultType을 "TestVo"만 써도 된다.

▶TestVo.java 파일 생성하기

- 생성 경로 : com.example.demo2.test.vo.TestVo

- Vo는 MVC에서 M, Model을 의미한다. DTO, VO라고도 표현한다.

package com.example.demo2.test.vo;

public class TestVo {
    private String id;
    private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

▶TestMapper.java 생성

- 생성 경로 : com.example.demo2.test.mapper.TestMapper

- Mapper 인터페이스를 생성한다.

package com.example.demo2.test.mapper;

import java.util.List;

import com.example.demo2.test.vo.TestVo;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;


@Repository
@Mapper
public interface TestMapper {
    List<TestVo> selectTest();
}

▶TestService.java 생성

- 생성 경로 : com.example.demo2.test.service.TestService

package com.example.demo2.test.service;

import com.example.demo2.test.mapper.TestMapper;
import com.example.demo2.test.vo.TestVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TestService {
    @Autowired
    public TestMapper mapper;

    public List<TestVo> selectTest() {
        return mapper.selectTest();
    }
}

▶TestController.java 생성 및 Service 호출

- 생성 경로 : com.example.demo2.test.controller.TestController

package com.example.demo2.test.controller;

import com.example.demo2.test.service.TestService;
import com.example.demo2.test.vo.TestVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

@RestController
public class TestController {

    @Autowired
    TestService testService;

    @RequestMapping(value = "/")
    public String home() throws Exception{
        return "Hello World";
    }

    @RequestMapping(value = "/test")
    public ModelAndView test() throws Exception {

        List<TestVo> testList = testService.selectTest();

        ModelAndView mav = new ModelAndView();
        mav.addObject("list", testList);
        return mav;
    }


}

▶test.jsp 생성

- 생성 경로 : resources/webapp/WEB-INF/views/test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>View Test Page</title></head>
<body><h2>Hello! ${name}</h2>
<div>JSP List Test</div>
<c:forEach var="item" items="${list}" varStatus="idx"> ${idx.index}, ${item.name} <br/> </c:forEach></body>
</html>
더보기

▶jsp 적용 방법

application.properties

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
devtools.livereload.enabled=true

pom.xml

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
  </dependency>
  <dependency>
  <groupId>org.apache.tomcat.embed</groupId>
  <artifactId>tomcat-embed-jasper</artifactId>
  <scope>provided</scope>
</dependency>

▶구조

빨간 네모는 수정한 부분

 

▶결과

 


▶ 주의 사항

명심 또 명심


▶ 추가 테스트

- test DB에 데이터를 추가하고 출력해보기

 

▶ DB에 데이터 추가

▶ testMapper.xml 수정

▶ 결과


 

참고 : goddaehee.tistory.com/204?category=367461

 

[스프링부트 (3)] SpringMVC(2) Spring Boot View 설정 및 JSP 연동하기(Thymeleaf 추가)

[스프링부트 (3)] SpringMVC(2) Spring Boot View 설정 및 JSP 연동하기(Thymeleaf 추가) 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ 스프링 부트 View 설정방법 ] 입니다. : ) 이번 포스팅에선 MVC 패턴중..

goddaehee.tistory.com

ModelAndView는 서블릿에서 제공하는 객체이다. viewName을 jsp 파일명으로 설정하면 자연스레 mapping이 이루어진다. Wowowowowow

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

taglib: 태그라이브러리!

우리가 java에서 사용하는 일종의 import와 유사한 기능이랄까..

prefix="c"는 python에서 보면 as와 같은 역할이랄까.

저거 외에도 jsp에서 사용할 수 있는 다양한 라이브러리가 존재한다.

 

천천히 사용해보면서 익숙해지면 될 듯 하다.

 

멘붕 ㅋㅋㅋㅋ

안되던게 갑자기 된다..ㅋㅋ

 

일단 중간에 놓쳤던 부분

 

pom.xml에 의존성 모듈을 처음에 추가하니 intellij 기준으로 글자가 빨간색이 뜨는 것이 아닌가...

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>

의존성 모듈을 따로 reimport 해주는 기능이 있는줄 몰랐었다.

 

저거 해주고 나니 괜찮아지더라

 

그리고 그 이후에 했던 것들

1. jstl version 정보를 추가하고 컴파일 한 것.

그런데 후에 지우고 해봐도 잘 된다 ㅋㅋㅋ(뭐지)

 

2. SpringBootApplication을 Run 한 것

intellij에서 run 방법이 2개가 있다.

 

Shift + F10

Ctrl + Shift + F10

 

내가 알고 있는 저 둘의 차이는 기존에 컴파일 했던걸 Run했던 것과 현재 켜져있는 것을 Run하는 것이라고 알고 있는데, 혹시 몰라 일단 적어봤다.

 

진짜 특이한건 이전에 안되던 곳에서도 잘 작동이 된다는 것... 코드 하나 안고쳤는데..ㅋㅋㅋㅋ

 

저 버전을 명시한 후 컴파일 한 번 했었던게 영향을 미쳤던게 아닐까 생각이 된다.

(gradle로 명시해놓은 것 보니깐 버전 정보가 다 명시가 되어 있더라)

 

해당 uri도 빨간색이었는데 어느 순간 초록색으로 바뀌었다.

 

참고 : jaystevency.tistory.com/19

 

[SpringBoot] #1 IntelliJ 에서 spring boot 시작하기

Spring Boot Project 개발 환경 Dev OS : Mac Sierra 10.12.3 IDE : IntelliJ IDEA 2016.2.4 Build #IU-162.2032.8, built on September 9, 2016 java : jdk 1.8 본 게시글은 박재성님의 spring-boot, JPA 질문/..

jaystevency.tistory.com

무작정 해보는 스프링 부트..ㅎ

 

스터디를 시작하고 나서 무작정 나만의 서버를 만들어보자! 하고 시작하게 되었습니다.

 

그럼 레츠 고오오

 

옛날에는 이클립스를 많이 썻었는데 IntelliJ 인터페이스가 너무 깔끔해서 IntelliJ로 갈아탔다.

 

학생 버전은 무료니깐~ 

 

각설하고

 

인텔리제이에서 한 번 손쉽게 Spring Boot 프로젝트를 만들어보자.

 

IntelliJ IDEA 2019.3.1
Java 8

더보기

면접 볼 때 Java 8 버전이 이전 버전들과 어떤 차이가 있냐고 물어봤었던 적이 있다.

 그래서 그 기억에 한 번 찾아봤다.

 

  • Lambda Expression 추가
  • Streams 인터페이스 추가
  • Default Method 추가

여기서 내가 아는건 Lambda Expression이 추가 되었다는 것..?

Lambda Expression은 함수를 생성하지 않고 함수를 쓸 수 있게 해주는 것이다.

 

Streams 인터페이스의 경우는 무엇인가 하니 리스트의 반복 연산을 stream().filter()를 활용하여 코드의 동작을 한눈에 볼 수 있게 해주는 것.

 

Default Method는 interface에서 사용되는 건데, 기존에는 interface에 method를 선언할 때 method만 선언할 수 있지 이에 대한 기능은 선언할 수 없었다. 하지만 이 기능이 생기면서 interface에서 선언한 method에도 기능을 추가할 수 있게 되었다는 것.

 

Default method를 만든 이유는 '하위 호환성' 때문이라고 한다.

 

1. 프로젝트 생성하기

Spring Initializr 선택 후 Next~

 

ArtifactID : 보통 Name(프로젝트 ID)와 동일하게 설정

Type : Maven Project

Java Version : 8 (11로 하니깐 IntelliJ 업데이트 하라더라 싫어서 안한다. 그리고 Java 11은 유료잖아. 8 먼저 써보자 ㅋㅋ)

더보기

Maven Project?

메이븐 프로젝트 구조와 내용을 기술하는 선언적 접근방식의 오픈소스 빌드 툴 입니다. 컴파일과 동시에 빌드를 수행할 수 있으며 테스트를 병행하거나 서버측 디플로이 자원을 관리할 수 있는 환경을 제공합니다.

라는데...응?

즉, 요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 네트워크를 통해서 라이브러리들을 자동으로 다운받아줍니다.

이걸 보니 이해가 된다.

실제로 프로젝트를 만든 후에 dependencies 정보를 확인해보면 프로젝트를 생성할 당시 체크했던 항목들이 들이pom.xml에 들어와 있는 것을 알 수 있다.

 

추가 정보

+ Type : Maven - 프로젝트 빌드 및 의존성 관리에 Maven 을 사용합니다. Gradle을 선택할 수도 있습니다.

+ Packaging: Jar - 패키징을 Jar로 하도록 설정합니다. War로도 설정할 수 있습니다.
+ Java Version: 8 - 자바는 1.8을 사용합니다.
+ Language: Javav - 언어는 Java를 사용합니다. Kotlin을 선택할 수도 있습니다.
+ Group com.tistory.offbyone - 자신에게 맞는 값을 넣으면 됩니다. 보통 도메인을 사용합니다.
+ Artifact: spring-boot-test - Mave 아티팩트명인데, 이것이 프로젝트명이 됩니다.
+ Version: 0.0.1-SNAPSHOT - 프로젝트의 버전입니다.
+ Description: Demo project for Spring Boot - 프로젝트 설명입니다.
+ Package : com.tistory.offbyone.springboot - 초기 소스들이 만들어질 기본 패키지명 입니다.

 

dependencies를 추가해주고 next

더보기

Developer Tools

이놈은 상당히 유용한 놈이라고 한다.

Chrome의 LiveReload와 같이 사용할 경우 프로젝트 파일을 저장하면 무조건 새로 컴파일해서 서버를 다시 껐다 킬 필요가 없다고 한다. 개꿀이 아닌가 꼭 설치하자 ㅋㅋ

 

Spring Web

RESTful, Spring MVC를 활용하여 web을 만들어 준다고 한다.

일단 가장 기본적인거 같으니 이놈을 한 번 써보자

 

Template Engine- Mustache

템플릿 엔진이란 템플릿 양식과 특정 데이터 모델에 따른 입력 자료를 합성하여 결과 문서를 출력하는 소프트웨어이다.

많은 코드를 줄일 수 있고(HTML에 비해 간단하다.), 재사용성이 높고(똑같은 디자인 페이지에 보이는 데이터만 바뀌는 경우가 굉장히 많다), 유지보수가 용이하다.

 

느낌은 알겠는데 직접 사용해봐야 할 듯 하다.

 

더보기

Spring MVC?

 

Model, View, Controller를 분리한 디자인 패턴의 일종이다.

 

다른 블로그 포스팅을 살짝 봤는데... 뭔가 한 번에 이해하기는 어렵다. 이건 따로 공부해서 포스팅 해봐야할 듯 하다.

이렇게 하면 프로젝트 완성!


2. index.html 파일 만들어서 띄워보기

resouce-static에 index.html 파일을 만들어보자

시작은 무조건 Hello World~

localhost:8080

출력 완료


3. DevTools + LiveReload 적용하기

이놈을 이용하면 서버를 다시 재시작 하지 않고도 프로젝트에서 변경된 정보를 저장만으로 반영시킬 수 있다.

 

1. Ctrl + Shift + A : compiler 입력

 

2. Build project automatically 클릭 -> OK 클릭

 

3. Ctrl + Shift + A : registry 입력

 

4. compiler.automake.allow.when.app.running 체크 박스 클릭 -> Close 클릭

5. 크롬에서 LiveReload 확장 프로그램 검색해서 다운로드 해주면 끗

 

6. index.html 데이터를 바꿔보면 약간의 딜레이는 있지만 F5를 누르면 바뀌는 것을 확인할 수 있다.

Day2가 되면 회사가 망하게 된다!

항상 Day1을 유지하게 하기 위한 '제프 베조스'의 철학이 담겨있다.

 

책에서 가장 기억에 남는 것은 바로 '고객중심적인 마인드'이다.

 

정말 철저하게 단기적인 손실보다 고객의 신뢰롤 훨씬 더 중요하고 가치있게 여기며, 말뿐만이 아닌 실제 행동으로 보여주는 사례들을 보니 이렇게 성장할 수 있었던 이유를 알 수 있었다.

 

1. 핑크 에어팟의 QC문제로 인해 배송이 지연될 것이라는 들은 담당자가 나라면 어떻게 했을 것인가?

당연스럽게 '이러이러한 사유로 인해 배송이 지연될 것 같습니다'라고 공지를 올릴 것이라고 일반 사람들은 생각했을 것이다.

하지만? 아마존에서는 소매상에게서 핑크 에어팟 4000개를 구매해 배송 일정을 맞췄다...ㅎ진짜 대단하지 않나?ㅋㅋ

 

2. VOD 서비스를 이용하다 불편을 느낀 고객이 클레임을 걸기도 전에 선제적으로 보상을 제공했다.

이런 시스템을 구축하고, 실제 실행하고 있는 것이 정말 고객의 신뢰를 가장 중요하게 생각하고 있구나 라는 것을 느낄 수 있었다.

 

 

'' 카테고리의 다른 글

[책] 수학의 아름다움  (0) 2019.06.04

해당 포스팅은 windows10 64bit / python 3.6 / IDE: pycharm / anaconda3에서 진행하였습니다.

귀여운 pyinstaller 아이콘..ㅋㅋ

pyinstaller란?

pyinstaller는 python으로 만든 프로그램을 python이 없는 환경에서 실행시켜주기 위해 실행파일로 만들어주는 프로그램입니다~

 

어떻게 설치하나?

설치 방법은 매우 간단합니다!

$ pip install pyinstaller

끝!

 

사용방법은?

사용방법은.....간단하지만 간단하지 않습니다. 하지만 하나씩 차근차근 해본다면 쉽게 만들 수 있다는 것!

제가 만든 프로젝트를 실행파일로 만들면서 겪은 여러 시행착오들을 하나씩 적어보려고 합니다.

 

일단 먼저 최초 실행

$ pyinstaller -F main.py

pyinstaller 명령어를 사용하여 본인이 만든 프로젝트의 main.py를 실행파일로 만들어주게 됩니다.

 

-F : 이 놈은 --onefile 옵션입니다. 즉, 모든 것들(리소스, 라이브러리 등등)이 실행파일 내부로 들어가기 때문에 하나의 실행파일로 내가 만든 기능을 수행할 수 있습니다. 

해당 옵션을 사용하지 않을 경우 여러가지 dll(=Dynimic Link Library)과 함께 생성되기 때문에 실행파일 크기면으로는 이득이지만, 배포하는데 문제가 생길 소지가 있어, 크지 않은 프로그램같은 경우는 단일 실행파일로 배포하는게 훨씬 깔끔합니다.

 

이렇게 명령어를 실행하면 'build' 폴더와 'dist' 폴더, 그리고 'main.spec' 파일이 생성이 됩니다.

 

만든 실행파일을 실행시켜보자!

 

자, 그럼 dist 폴더로 들어가서 main.exe 파일을 실행시켜보면?

아니 무슨 cmd창이 뜨고 바로 사라져버리는 것이 아닌가....ㅋㅋ

만약 바로 원하던 프로그램이 실행이 되면 그냥 그대로 쓰시면 됩니다.

 

하지만 조금이라도 큰 프로젝트를 만들었다면 분명 바로 실행이 될 일이 없으실 겁니다. 

 

자.....순식간에 사라진 cmd 창을 자세히 보셨으면 어떤 글씨들이 썻다가 지워지는 것을 볼 수 있으셨을 겁니다.

 

어떤 메세지가 떴나 확인을 하기 위해서는 실행파일을 cmd창에서 실행시키면 됩니다.

 

저는 git bash를 이용하여 실행시켰습니다.

$ ./main.exe

흠..... KeyError가 떳었구나.....

저의 경우는 KeyError가 떴군요...?

 

해당 에러 이외에도 모듈을 찾을 수 없는 에러라던가, 해당 파일이 존재하지 않는다던가 하는 에러들이 뜹니다.

 

문제를 해결하기 위해서는! 처음 pyinstaller를 실행했을 당시 생성된 'main.spec' 파일을 수정해야 합니다.

 

main.spec 파일을 알아보자

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

block_cipher = None


a = Analysis(['main.py'],
             pathex=['C:\\Users\\PC\\PycharmProjects\\plcMonitoring_2'],
             binaries=[],
             datas=[],
             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='main',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )

※ 최초에는 pyinstaller -F main.py로 실행파일을 만들었지만, main.spec을 수정한 후에는 pyinstaller -F main.spec을 실행시켜줄 겁니다.

$ pyinstaller -F main.py
$ pyinstaller -F main.spec

 

여기서 우리가 주목해야 할 부분은 datashiddenimports 값들입니다.

 

datas : 리소스 파일의 경로를 입력하게 됩니다. 입력방법은 tuple 또는 list 형태로 들어가게 되구요.

저는 튜플 방식을 사용했고, 만약 './img/image.png' 파일을 실행파일에 포함시키고 싶다?

튜플 형식 : (src, dest)

datas = [('./img/image.png', './img')]

 

이렇게 넣어주면 됩니다.

 

여러개의 파일을 추가할 때는 

datas = [('./img/image.png', './img'),

('./img/image2.png', './img'),

('./img/image3.png', './img')

]

콤마를 이용하여 작성하면 되구요.

 

폴더 내에있는 모든 리소스를 추가하고 싶으면 

datas = [('./img/*', './img')]

*표를 사용해주면 됩니다.

 

다음으로는 hiddenimports 속성을 한 번 보겠습니다.

 

hiddenimports : 여러가지 패키지, 모듈을 연결할 때 사용합니다.

모듈을 찾지 못했다는 에러가 나왔을 경우 해당 값을 수정해주시면 됩니다.

pyinstaller의 경우 사용자 모듈을 추가해서 작성해주어야 합니다.

 

예를 들어, 내가 a.py에서 'from 공통.통신 import 시리얼통신'이라는 모듈을 못찾았다는 에러를 확인할 경우

 

hiddenimports = ['공통.통신.시리얼통신']

와 같이 작성해주시면 됩니다.

 

여러 개의 모듈을 등록할 경우

 

hiddenimports = ['공통.통신.시리얼통신',

'공통.통신.시리얼통신2'

]

콤마(,)를 이용하여 나열해주시면 되구요.

 

hiddenimports = ['공통.통신.*']

이와 같이 별표(*)를 이용하여 패키지 안의 모든 모듈들을 연결해줄 수도 있습니다.

 

어..? 그런데도 리소스가 안찾아지는데요?

이건 제가 겪은 상황입니다ㅋㅋ.

 

문제의 원인은 실행 위치.....ㅋ

 

저는 프로젝트를 만들 때 상대경로를 이용하여 리소스를 불러왔습니다.

 

하지만 실행파일을 이용하여 프로그램을 실행시키려고 하니.... 

 

리소스들의 위치가 실행파일위치 기준이 아닌 AppData/local 내부에 있는 것이었습니다.

 

문제 해결을 위해서

try:
    os.chdir(sys._MEIPASS)
    print(sys._MEIPASS)
except:
    os.chdir(os.getcwd())

main문 최초 실행 당시 위와같이 작업 경로 변경을 통해 문제를 해결해주었습니다.

 

위와 같이 해주면 실행파일에 포함된 리소스들이 잘 해결될 겁니다.

 

혹시 이렇게 해도 리소스를 못찾을 경우 댓글 남겨주세요!

 

콘솔창 안뜨게 하기

이건 정말 간단합니다.

 

main.spec 파일을 보면 console=True 되어있는데 False로 바꿔주면 됩니다.

 

프로그램 이름이랑 아이콘 생성하기

이것도 간단합니다.

 

main.spec 파일을 보면 name='main'으로 되어있을 텐데 원하시는 것으로 바꾸면 됩니다.

icon의 경우 

EXE( ... ) 내부에

icon = 'icon.ico'

를 추가해주면 됩니다.

exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='실행파일이름',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True,
          icon='아이콘.ico')

 

이상 pyinstaller를 이용하여 실행파일 만들기였습니다!

+ Recent posts