레이블이 pyenv인 게시물을 표시합니다. 모든 게시물 표시
레이블이 pyenv인 게시물을 표시합니다. 모든 게시물 표시

replace intel app to apple app

mac intel -> M1(apple silicon)으로 마이그레이션 후
intel kind의 프로세서들은 rosetta2 에뮬레이터가 변환해서 apple silicon 에서도 동작한다.
하지만 변환과정으로 비효율적이다.
activity Monitor.app > kind 로 intel 프로세스를 확인할 수 있다.

아직 apple silicon(arm64) 바이너리가 많이 없지만 있다면 대체해보자.

# file 명령으로 바이너리가 어떤 환경에서 실행 되는지 알 수 있다.
file /bin/sh

# bin/zsh 는 arm64, x86_64 둘다 지원하는 universal binary 다.
file /bin/zsh

# intel 용으로 zsh 를 실행하기
arch -x86_64 /bin/zsh

# arm64 용으로 zsh 를 실행하기
arch -arm64 /bin/zsh

# 그런데 /usr/local/bin/zsh 는 x86_64 바이너리다.
file /usr/local/bin/zsh

# 아래 사이트에서 brew 설치 스크립트를 실행하면
# apple silicon 용(/opt/Homebrew/bin 에 설치) homebrew 로 설치 된다.
# 설후 설정을 보면 HOMEBREW_PREFIX: /opt/Homebrew 로 되어 있다.
brew config

# apple silicon 용 brew 등의 바이너리를 우선 실행할 수 있도록 한다.
export PATH=/opt/Homebrew/bin:$PATH

# 이제 쉘을 재시작하고 zsh 설치해 보자.
# bash 도 arm64 으로 설치하자.
brew install zsh bash

# 새로 설치된 zsh 는 arm64 버전이다.
which zsh
/opt/Homebrew/bin/zsh
file /opt/Homebrew/bin/zsh
/opt/Homebrew/bin/zsh: Mach-O 64-bit executable arm64

# 이제 brew 로 arm64 버전의 프로그램을 설치 할 수 있다.
brew install vim fzf git lsd wegt dog 등등

# 참고로 x86_64 용(/usr/local/bin 에 설치) brew 를 사용하려면
# x86_64 용(/usr/local/bin 에 설치) homebrew 설치하고
arch --x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/
install/HEAD/install.sh)"

# 다음과 같이 사용한다.
arch --x86_64 /usr/local/Homebrew/bin/brew install {패키지이름}

#####

arm64 zellij (/opt/Homebrew/bin/zellij) 0.39.1 을 사용하면 status-bar 등의 코드에서 에러가 발생한다.
SSE2 명령셋등 intel cpu 종속적인 코드가 있어 보인다.

# 당분간은 x86_64 zellij 사용하기 위해 arm64 로 설치된 zellij 는 제거한다.
brew uninstall zellij

# 몇주 후 0.39.2 버전이 나왔고 설치하니 해결되었다.
arch -arm64 brew install zellij

# 버전확인
/opt/homebrew/bin/zellij --version
zellij 0.39.2

# arm64 바이너리 확인
file /opt/homebrew/bin/zellij
/opt/homebrew/bin/zellij: Mach-O 64-bit executable arm64

#####

# 마이그레이션 후 파이썬 설치시
brew install python

# 또는 uname -m 이 x86_64 라면
arch -arm64 brew install python

# 다음과 같은 에러가 발생했다.
Error: An exception occurred within a child process:
  FormulaUnavailableError: No available formula with the name "/opt/Homebrew/Library/Taps/homebrew/homebrew-core/Aliases/python".

# 확인해보니 다음 경로 자체가 없었다.
/opt/Homebrew/Library/Taps/homebrew/homebrew-core

# homebrew/core 를 다시 구성후 설치하면 된다.
# 구성에 시간이 좀 걸린다.
brew tap homebrew/core

# 만약 /opt/Homebrew/Library/Taps/homebrew/homebrew-core 경로가 있는 상태에서도 안되면 삭제후 시도해보자.
rm -rf /opt/Homebrew/Library/Taps/homebrew/homebrew-core

#####

# 마이그레이션 후 
# pyenv 로 python 설치하면 다음과 같은 이유로 실패 한다.
pyenv install -v 3.12
ld: warning: duplicate -rpath '/Users/ysoftman/.pyenv/versions/3.12.0/lib' ignored
ld: warning: duplicate -rpath '/opt/homebrew/lib' ignored
ld: warning: search path '/Users/ysoftman/.pyenv/versions/3.12.0/lib' not found
ld: warning: search path '/Users/ysoftman/.pyenv/versions/3.12.0/lib' not found
ld: Undefined symbols:
ld: Undefined symbols:
  _libintl_bindtextdomain, referenced from:
      __locale_bindtextdomain in _localemodule.o
      __locale_bindtextdomain in _localemodule.o
  _libintl_dcgettext, referenced from:
      __locale_dcgettext in _localemodule.o
  _libintl_dgettext, referenced from:
      __locale_dgettext in _localemodule.o
  _libintl_gettext, referenced from:
      __locale_gettext in _localemodule.o
  _libintl_setlocale, referenced from:
      __locale_setlocale in _localemodule.o
      __locale_setlocale in _localemodule.o
      __locale_localeconv in _localemodule.o
      __locale_localeconv in _localemodule.o
      __locale_localeconv in _localemodule.o
      __locale_localeconv in _localemodule.o
  _libintl_textdomain, referenced from:
      __locale_textdomain in _localemodule.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Programs/_freeze_module] Error 1
make: *** Waiting for unfinished jobs....

# libintl.a 라이브러리에 있는 심볼들이 보인다.
# /opt/homebrew/lib/libintl.a 를 참조하지 않는게 문제 같다.
nm /opt/homebrew/lib/libintl.a | rg  "_libintl_(bindtextdomain|dcgettext|dgettext|gettext|setlocale)$"

# 구글링으로 여러 방법들을 시도...
# gettext library 를 찾지 못한다고 해서 다시 설치했지만 안된다.
brew reinstall gettext

# arm64 library 을 찾도록 LDFLAG 를 설정해도 안된다.
export LDFLAGS="-L/opt/homebrew/lib"
export CPPFLAGS="-I/opt/homebrew/include"

# 기존 x86_64 라이브러를 우선 참조하게 되는것 같아 해당 path 를 강제 삭제해도 안된다.
rm -rf /usr/local/Cellar/{gettext,readline}

# arm64 용으로 make gcc 등 컴파일러 최신으로 설치해도 안된다.
arch -arm64 brew install cmake make gcc

# 이번에는 실제 파이썬 소스를 다운받아 다음과 같이 빌드하면 잘된다.
# 아래처럼 configure 로 Makefile 이 생성하면 CC=gcc CXX=g++ 로 설정되어 있다.
git clone https://github.com/python/cpython
cd cpython; ./configure && make -j10

# pyenv 빌드시 clang (Apple clang version 15.0.0) 대신 
# 컴파일러를 gcc(없다면 설치 brew install gcc)로 변경하니 된다.
CC=/opt/homebrew/bin/gcc-13 pyenv install -v 3.12

# 몇달 후 zellij, /opt/homebrew 패키지들을 arm64 로 다시 설치등의 변화가 있었는데,
# 별도 CC 설정없이 clang (Apple clang version 15.0.0) 로도 됐다.
pyenv install -v 3.12

ycmd server SHUT DOWN 에러 해결하기

# youcompleteme(ycm) 플러그인을 설치 후 vim 시작시 다음과 같은 에러가 발생한다.
# 참고로 ycm 은 클라이언트이고 third_party/ycmd 에 서버 소스가 있다.
The ycmd server SHUT DOWN (restart with ':YcmRestartServer')

# 다음과 같이 인스톨을 다시 해줘야 한다.
cd ~/.vim/plugged/youcompleteme
git submodule update --init --recursive
./install.py --all --verbose

# 만약 ./install.py 수행시 c++11 지원 안된다는 에러가 발생하는 경우
CMake Error at CMakeLists.txt:247 (message):
  Your C++ compiler does NOT fully support C++11.

# gcc 는 있지만 g++ 이 설치되어 있지 않아서다.
# 다음과 같이 g++ 를 설치 후 ./install.py
sudo yum install gcc-c++

# 만약 다음과 같은 에러가 발생하는 경우
fatal error: pyconfig.h:

# python-devel 을 설치 후 ./install.py
sudo yum install python-devel

#####

# M1(arm64) 맥북 환경에서 다음과 같이 빌드시 clang 에러가 발생했다.
./install.py --all --verbose

# 원인은 pyenv 로 설치한 python3.12(~/.pyenv/shims/python)가
# 설치시 다음과 같이 gcc 로 빌드해서였다.
CC=/opt/homebrew/bin/gcc-13 pyenv install -v 3.12

# clang 으로 다시 빌드해 설치 후
pyenv install -v 3.12

# ycmd 를 다시 빌드하면 된다.
./install.py --all --verbose

python2, python3 동시에 사용하기

# python2, python3 각각 설치하면 버전에 맞는 PYTHONPATH 를 설정해야 한다.
# pyenv python 버전별 설치 및 버전별 스위칭을 해준다.
# pyenv 를 이용해서 python2, python3 설치하면 PYTHONPATH 신경쓸필요 없이 각 버전에 맞는 환경이 설정되어 잘 실행된다.
# pyenv(https://github.com/pyenv/pyenv)를 설치하자
brew install pyenv

# 쉘 설정 끝에 추가한다.
echo 'eval "$(pyenv init -)"' >> ~/.zshrc

# 쉘을 다시 시작하면 다음과 같이 환경변수에 pyenv 가 가장 우선하게 된다.
echo $PATH
/Users/ysoftman/.pyenv/shims:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

# 파이썬 2.7.14 버전 설치
# -f, --force
pyenv install -f 2.7.14

# 파이썬 2.7.12 버전 삭제
pyenv uninstall -f 2.7.12

# 파이썬 3.6.4 버전 설치
pyenv install -f 3.6.4

# 참고로 mac 에서 pyenv install 3.6.4 설치시
# [Modules/posixmodule.o] Error 1 .. 등이 발생할 하면 xcode 를 업데이트해보자.
# 사용 가능한 파이썬 버전 확인, *현재 기본(전역) 설정된 값
pyenv versions
  2.7.14
* 3.6.4 (set by /Users/ysoftman/.pyenv/version)

# 현재 전역으로 설정된 파이썬 버전 확인
pyenv global

# python3 을 전역으로 설정하는 경우
pyenv global 3.6.4

# 파이썬 3.6.4 을 사용하는 ysoftmanProejctA 이름의 가상환경 생성
# pyenv 로 3.6.4 가 설치되어 있어야 한다.
pyenv virtualenv 3.6.4 ysoftmanProejctA

# virtualenv 리스트
pyenv virtualenvs

# ysoftmanProjectA 가상환경 활성화(시작)
pyenv activate ysoftmanProjectA

# ysoftmanProjectA 가상환경 비활성화
pyenv deactivate ysoftmanProjectA

# virtualenv 삭제
pyenv uninstall ysoftmanProjectA

# 현재 작업중인 디렉토리에서는 python3 를 사용한다면 다음과 같이 실행
# .python-version 파일이 생성되며 내용은 3.6.4 로 명시된다.
pyenv shell 3.6.4

# 이제 같은 쉘 환경에서 python 또는 python3 를 실행이 가능하다.
# 참고로 패키지는 설치는 pip, pip3 그대로 사용하면 된다.
pip2 install numpy pillow matplotlib
pip3 install numpy pillow matplotlib

##########

# pyenv 파이썬 버전만 변경하기 때문에 프로젝트별 패키지를 구분해 관리하려면 
# virtualenv(https://github.com/pypa/virtualenv)를 설치하자
brew install pyenv-virtualenv

# ~/.bashrc 에 다음을 추가해준다.(필요한 경우만)
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
export PYENV_VIRTUALENV_DISABLE_PROMPT=1

# 참고로 pyenv virtualenv-init - 명령을 실행하면
# precmd_function 에 _pyenv_virtualenv_hook() 를 추가 시키고
# 이 함수는 pyenv sh-activate 를 실행하는게 이게 느림(400ms 정도)
# prompt 속도가 느려지니 필요없으면 제외시키자.

# ysoftman1 디렉토리에 python3.6 가상환경 생성
virtualenv ysoftman1 --python=python3.6

# ysoftman1 가상환경 활성화
source ./ysoftman1/bin/activate

# ysoftman1 가상환경 비활성화(activate 스크립트에 deactivate()가 있음)
deactivate

# ysoftman1 가상환경 삭제
rm -rf ./ysoftman1

# 참고로 venv 는 virtualenv 의 경량버전으로 python3.3 부터 기본으로 포함되어 있다.
# 경량버전이라 기능이 적고 virtualenv 보다 속도가 느리다고 한다.
# 현재 디렉토리에 venv 가상환경 설정
# python3 -m venv .

##########

# pip+virtualenv 를 합친 pipenv(https://github.com/pypa/pipenv) 설치
# pipenv 내부적으로 virtualenv 를 사용한다.
pip install pipenv

# 현재 경로의 프로젝트에 새로운 가상환경 생성
# (package.json 같은) Pipfile 패키지 파일을 생성한다.
pipenv
# 또는
pipenv --python 3.7

# 현재 프로젝트(가상환경) 홈 위치 확인
pipenv --where

# 현재 프로젝트의 실제 가상환경 위치 확인
# 이 위치로 패키지,파이썬 등이 설치된다.
# /Users/ysoftman/.local/share/virtualenvs/ysoftmant-test-1234 등의 위치가 된다.
pipenv --venv

# 현재 프로젝트(가상환경)에 패키지 설치(pip)
pipenv install package_name

# 현재 프로젝트(가상환경)에 패키지 삭제(pip)
pipenv uninstall package_name

# 현재 로컬(setup.py)을 현재 프로젝트(가상환경)에 설치
pipenv install -e .

# 현재 프로젝트(가상환경)을 가진 shell 실행
# 가상환경 설정을 반영(. ~/가상환경 설정 경로)한 쉘을 생성한다.
pipenv shell

# 현재 프로젝트(가상환경)에 설치된 패키지 정보 확인
pipenv graph

# 현재 프로젝트(가상환경)에서 실행하기
pipenv run aaa.py

# 현재 프로젝트(가상환경) 제거하기
pipenv --rm

# pipfile.lock 갱신하기
pipenv lock

python 실행 에러

# case1
# 설치는 했지만 pip(python2) 를 찾을 수 없는 경우가 있다.
# python2 를 재설치
brew reinstall python@2

# 안되면 강제 삭제 후 재설치

brew uninstall --ignore-dependencies python@2
brew install python@2

# 참고로 centos 에서
sudo alternatives --set python /usr/bin/python2
# 또는
sudo alternatives --set python /usr/bin/python3
# 로 기본 파이썬 실행 /usr/bin/python 을 설정할 수 있다.

# case2
# pip install requests 모듈을 설치했는데도 
# 파이썬 실행시 다음과 같이 모듈이 없다는 에러가 발생한다.
ImportError: No module named requests

# 해당 모듈은 이미 설치가 된 상태이다.(맥 기준)
pip install requests 
Requirement already satisfied: requests in /Library/Python/2.7/site-packages

# 현재 파이썬에서 사용되는 라이브러리 경로를 확인해보면
# /Library/Python/2.7/site-packages 가 포함되어 있지 않다.
python
>>> import sys
>>> print sys.path

# 파이썬 모듈은 sys.path 에 설정된 경로에서 찾는다.
# PYTHONPATH 환경변수로 다음과 같이 추가하면 sys.path 에 추가된다.
# mac 의 경우
export PYTHONPATH=/Library/Python/2.7/site-packages

# linux 의 경우
export PYTHONPATH=/usr/local/lib/python2.7/site-packages

# sys.path 를 다시 확인해보면 경로가 추가되었고,이제 모듈 에러가 발생하지 않는다.
# 하지만 3.x 버전에선 다시 실행되지 않는 문제가 있다.
# python2, 3 을 모두 사용하려면 pyenv(별도 포스트 참고)로 파이썬을 버전별로 사용하자.
# pip 로 설치시 sudo 를 주면 root 권한으로 설치된다.
# 나중에 설치 삭제때 문제가될수 있어 권한을 사용자로 변경한다.
cd /usr/local/lib/python2.7/site-packages
sudo chown -R ysoftman:admin *

# case3
# python setup.py egg_info 에러 발생하는 경우
# pip 와 setuptools 를 최신으로 업그레이드 하자
sudo pip install --upgrade pip setuptools

# case4
# docker package 를 찾지 못하는 에러가 발생하는 경우
python -c "import docker"
ImportError: No module named docker

# 패키지는 설치된것으로 나온다.
pip list | grep docker

# 이럴땐 pip 로 해당 패키지를 unistall 해주고
sudo pip uninstall -y docker docker-py

# pip 로 docker 패키지를 다시 설치하자.
# 참고로 최신 docker 패키지에 docker-py 기능이 포함되어 있어
# docker-py 를 설치하면 다음의 에러가 발생하여 docker 만 새로 설치해야 한다.
# module' object has no attribute 'APIClient'
sudo pip install --force-reinstall --no-cache-dir docker