Programming Language/Python2022. 3. 25. 15:29
728x90

pyCharm에서는 그냥 되던게, Visual Studio Code에서는 안되네요.

 

작업디렉토리에 있는 Main.py가 아닌, 아래 모듈에서 실행을 하면 프로젝트의 다른 모듈을 못찾아서 ModuleNotFoundError가 납니다. 원인은 모듈 검색 경로에 working directory 를 못찾아서 발생하는 거라고 합니다.

하위 경로의 모듈을 실행하려면, 파이썬은 모듈검색 과정에서 working Directory를 추가해줘야 한다. (3번 참조)

참고로, 모듈 검색과정은 sys.modules, build-in moudels, sys.path 순서로 진행되고, 실행위치는 sys.path에 포함된다.

 

 - 참조 visual studio code Docs : https://code.visualstudio.com/docs

 

1. 현재환경

 - anaconda로 가상환경 사용

 - python : 3.9 (32bit) - 아나콘다로 가상환경을 사용중

 

2. 실행 및 디버그 수행 - F5 (Ctrl + Shift + D) 해결방법 (빠른 실행은 3.번을 읽어주세요)

1) visual studio code에서, Ctrl + Shift + P 누른후, python Select Interpreter를 가상환경으로 변경한다.

2) Ctrl + Shift + `를 누르고, 새 터미널을 생성한다. 새 터미널 우측 에 [+]옆 아래 화살표를 누르면, 

   메뉴가 나오는데, "기본 프로필 선택" 선택한다.  이때, Command + Prompt를 선택한다.

   기본 설정인, PowerShell에서는 실핼 때, 아나콘다 가상환경이 설정환경으로 변경이 되지 않았다.

   다행히 기본 Command + Prompt 로 수행하면, 정상처리가 된다.

3) Ctrl + Shift + D를 누르고, "실행 및 디버그"에서 launch.json파일을 만들고,

   기본 설정에 아래와 같이 env 설정을 추가한다.

4) F5(디버깅 시작) or Ctrl + F5(디버깅없이 시작)

   그런데.... 매번 이러니까... 느림.....

 

# .vscode/launch.json

{
    "version": "0.2.0",
    "configurations": [
      {
        "name": "Python: 메인",
        "type": "python",
        "request": "launch",
        "program": "${file}",
        "console": "integratedTerminal",
        "env": {
            "PYTHONPATH": "${workspaceFolder}"
        },
        "justMyCode": true
      }
    ]
  }

 

3. Run Code, .... 수행 - F5 (Ctrl + Alt + D) 해결방법

 

2.번 방법은 수행이 느리고, pyCharm보다 왜 느릴까 하다가 다시 방법을 찾아봄.

Code Runner 를 깔면, py파일 우측 상단에 ▷화살표가 표시되는데, Run Code, Run Python File, ... 표시됨.

실행이 여기 저기 있다보니 햇갈림. Run Code 는 Code 터미널이 별도로 수행이 되고 있고, 환경을 잡아 주면 Code 수행 터미널에서 수행이 됨. 그래서 Run Code 환경을 추가함.

 

1, 2) 2.번의 1), 2) 까지는 동일함.

3) Ctrl + P를 누르면, setting.json 설정환경을 수정할 수 있습니다. setting.json에서 아래 아래 환경을 추가합니다.

   아래 환경을 추가하면, terminal에서 작업폴더가 PYTHONPATH에 자동으로 추가됩니다.

   그리고, 2.번  launch.json 파일의 PYTHONPATH 설정해도 됩니다.

   다른 OS는 terminal.integrated.env.linux, terminal.integrated.env.osx 참조하세요.

"terminal.integrated.env.windows": {
    "PYTHONPATH": "${workspaceFolder}"
}

4) Run Code 시, conda activate가 cmd 초기에 늦게 수행이 되서 처음에 오류나 발생해서, .vscode/settings.json파일을 만들고 기본 Command를 추가한 후 기본으로 설정함. (2.2) 번을 다시 변경함). 이렇게 하면 cmd 수행 시 바로 conda activate 가 되고, 수행을 한다.

 

# .vscode/setting.json

{
    "terminal.integrated.profiles.windows": {
        "Cmd-Conda": {
          "path": ["cmd.exe"],
          "args": ["/K","C:\\Users\\아이디\\Anaconda3\\Scripts\\activate.bat", "system_trading_py39_32"]
        }
      },
    "terminal.integrated.defaultProfile.windows": "Cmd-Conda"
}

5) ▷화살표를 누르거나, Ctrl + Alt + N으로 수행한다. 런처보다는 빠르게 수행인된다.

 

ps. Run Code는 잘 되는데, Run Python File 수행은 오류가 발생... 아, 이건 그냥 "실행 및 디버그"로 수행하는 걸로.

 

 

 

 

728x90

'Programming Language > Python' 카테고리의 다른 글

dataframe 출력 사이즈 설정  (0) 2022.05.31
[Python] pandas - DataFrame Text 출력  (0) 2022.03.19
[Python] 클래스  (0) 2022.03.14
[Python] 모듈과 패키지  (0) 2022.03.14
[Python] 내장함수  (0) 2022.03.14
Posted by 하루y
Programming Language/Python2022. 3. 10. 22:25
728x90

handler에서 encoding을 설정하는데, 각 handler의 아큐먼트(args) 위치에서 encoding 자리에서 설정합니다.

주의할 점은, 테스트 Python 버전은 3.9인데, config파일에 한글(2바이트)문자가 있으면 오류가 발생함.

버전 3.10에는 fileConfig의 아규먼트에 encoding가 추가되었습니다.

 

추가적인 handler의 args 양식은 아래 자료를 참조하세요. 

 

참조자료

 - loggin.config  : https://docs.python.org/ko/3/library/logging.config.html#module-logging.config

 - loggin.handlers:   https://docs.python.org/ko/3/library/logging.handlers.html

 

import logging.config

logging.config.fileConfig('../logging.conf')
logger = logging.getLogger(__name__)

logger.info("테스트 입니다.")

 

내용추가. (2022-03-17)

qualname 설정과 패키지에 대해서

 - 시스템의 패키지가 java처럼 하나로 묶이지 않으면, Log가 일부에서 출력되지 않는 문제가 발생함. Class는 정상적으로 나오는데,  Class가 없는 Util에서 로그가 출력 되지 않음. qualname을 모듈의 package가 다르니(예: util / api / data), 로그하나로 qualname설정으로 비Class 로그는 출력이 되지 않음. 테스트 해보면, 앞 패키지로 제어되는 건 확인됨.

그래서, util / api / data를 JAVA 처럼 sample/util, sample/api, sample/data 로 변경하면, 전체 로그가 출력됨.

 

package를 sample.main / sample.util / sample.api 이렇게 구조를 잡아야 전체를 제어할 수 있다.
qualname=sample 로 설정하면, 모든 로그를 출력할 있다.
logging.config.fileConfig('logging.conf') <-- main 에서 한 번만 호출하면 된다.
logger = logging.getLogger(__name__)  <-- 각 모듈에서 한 번만 호출한다.

 

 

logging.conf 파일 내용입니다.

[loggers]
keys=root, infoLogger

[handlers]
keys=consoleHandler, fileHandler

[formatters]
keys=consoleFormatter, fileFormatter

####################
## logger
####################
[logger_root]
# level=NOTSET
# handlers=
level=DEBUG
handlers=consoleHandler

[logger_infoLogger]
level=DEBUG
handlers=consoleHandler, fileHandler
# package를 sample.main / sample.util / sample.api 이렇게 구조를 잡아야 전체를 제어할 수 있다.
# qualname=sample 로 설정하면, 모든 로그를 출력할 있다.
# logging.config.fileConfig('logging.conf') <-- main 에서 한 번만 호출하면 된다.
# logger = logging.getLogger(__name__)      <-- 각 모듈에서 한 번만 호출한다.
qualname=sample
propagate=0

####################
## handler
####################
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=consoleFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
formatter=fileFormatter
# FileHandler(filename, mode='a', encoding=None, delay=False, errors=None)
args=('logfile.log','a','utf8')

####################
## formatter
####################
[formatter_consoleFormatter]
format=%(asctime)s %(name)s [%(levelname)-8s] %(message)s
datefmt=

[formatter_fileFormatter]
format=%(asctime)s %(name)s [%(levelname)-8s] %(message)s
datefmt=

아래는 TimedRotatingFileHandler 에서 args 설정.

[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
formatter=fileFormatter
# TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None, errors=None)
# when: 'midnight', 'W0'-'W6', D', 'H', 'M'
#    - W0 is monday
args=('logfile.log', 'midnight', 1, 0, 'utf8')
728x90
Posted by 하루y
728x90

 

SettingWithCopyWarning 경고가 계속 발생할 때 해결방안

 

1) Dataframe의 slice를 복사 후 사용한다.

  # df = df[(df.A > 10) & (df.B < 5)] 아래 구분으로 변경한다.
  df = df[(df.A > 10) & (df.B < 5)].copy()
  df['1/PER'] = 1 / df['PER']

2) 경고를 끈다

import pandas as pd

# 경고를 끈다 (기본값: 'warn')
pd.set_option('mode.chained_assignment',  None)

# 중략...
df = df[(df.A > 10) & (df.B < 5)]
df['1/PER'] = 1 / df['PER']

 

end.

728x90
Posted by 하루y
728x90

SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)'))

 

인증서 오류 시 --trusted-host 옵션을 사용한다.

 

$ pip install requests bs4 lxml openpyxl numpy
There was a problem confirming the ssl certificate

$ pip --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --trusted-host pypi.org install requests bs4 lxml openpyxl numpy

 

 

Usage:   
  pip <command> [options]

Commands:
  install               Install packages.
  download          Download packages.
  uninstall            Uninstall packages.
  freeze               Output installed packages in requirements format.
  list                   List installed packages.
  show                Show information about installed packages.
  check               Verify installed packages have compatible dependencies.
  config              Manage local and global configuration.
  search              Search PyPI for packages.
  cache               Inspect and manage pip's wheel cache.
  index               Inspect information available from package indexes.
  wheel              Build wheels from your requirements.
  hash               Compute hashes of package archives.
  completion      A helper command used for command completion.
  debug            Show information useful for debugging.
  help               Show help for commands.

 

General Options:
  -h, --help        Show help.
  --isolated        Run pip in an isolated mode, ignoring environment variables and user configuration.
  -v, --verbose    Give more output. Option is additive, and can be used up to 3 times.     
  -V, --version    Show version and exit.

  --trusted-host <hostname>

   Mark this host or host:port pair as trusted, even though it does not have valid or any HTTPS.

  ... 중략 ...

 

end.

728x90
Posted by 하루y