[Python 3.7] 리눅스로 시작하기
1. Python 3.7 설치 (CentOS 6.9)
1-1 라이브러리 확인
yum -y install openssl
yum -y install openssl-devel
yum -y install bzip2-devel
yum -y install sqlite-devel
yum -y install zlib-devel
yum -y install libffi-devel
python3.7.x 버전에서는 libressl 2.6.4 이상의 버전 설치
# 1). 소스 다운로드
wget https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.9.2.tar.gz
tar xvf --
# 2). 빌드환경 설정
cd libressl-2.9.2
./configure --prefix=/usr/local/ssl
# 3). 컴파일 및 설치
make && make install
# 4). 공유라이브러리 자동 로딩 설정
# 설치 완료
cd /usr/local/ssl
cd lib
vi /etc/ld.so.conf.d/ssl.conf
# so에 해당하는 파일은 모두 메모리에 올림
# ssl.conf editing
/usr/local/ssl/lib
:wq
#
# 제대로 메모리에 올라오는 지 확인
ldconfig -v | grep ssl
1-2 Python 3.73 설치
# 1). 다운로드
# 홈페이지(https://www.python.org/downloads/source/)에서 copy link
wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
tar xvfz Python-3.7.3.tgz
# 2). 빌드환경 설정
cd Python-3.7.3
./configure --prefix=/usr/local/cafe24/python3.7.3 --with-openssl=/usr/local/ssl --enable-shared
make
make install
# 3). 공유 라이브러리 로딩 설정
vi /etc/ld.so.conf.d/python.conf
/usr/local/cafe24/python3.7/lib
# python 링크걸어줄 것이므로 경로는 주의
cd /usr/local/cafe24
ln -s python3.7.3/ python3.7
# 4). 제대로 메모리에 올라오는 지 확인
ldconfig -v | grep python
# 5). 환경변수 설정
vi /etc/profile
# /etc/profile editing
# python 3.7
export PATH=$PATH:/usr/local/cafe24/python3.7/bin
:wq
#
# 동작하는 지 확인
python3
2. Python Isolation Tools (Virtual Environment)
- venv : python3.3 버전 이 후 부터 기본 모듈
- virtual env : python 2부터 사용해오던 가상환경 라이브러리
- py env : python interpretor version manager
- conda : Anaconda Python 설치했을 때 사용할 수 있다.
- etc : virtualenvwrapper, buildout
2-1 virtual env
1) 설치 (linux terminal, 파이썬 기준으로 전역 설치)
pip3 install virtualenv
2) project 생성
mkdir dowork[작업용 디렉토리]
cd dowork
mkdir python-projects[파이썬 프로젝트 모음]
mkdir [프로젝트명]
cd [프로젝트명]
3) 가상환경 생성
# /dowork/python-projects/[프로젝트] 에 virtualenv를 전역에서 복사하여 venv로 프로젝트에 가상환경 설정
virtualenv venv
4) 가상환경 구동
# 가상환경에서 작업할 수 있음
source venv/bin/activate
# 정상 작동 확인하기
(venv) [root@localhost loganalysis]# python --version
# 빠져나오기
(venv) [root@localhost loganalysis]# deactivate
2-2 python3 -m venv
# 가상환경에서 작업할 수 있음
source venv/bin/activate
# 정상 작동 확인하기
(venv) [root@localhost loganalysis]# python --version
# 빠져나오기
(venv) [root@localhost loganalysis]# deactivate
# virtual env로 작업해보기
(venv) [root@localhost loganalysis]# pip install psycopg2
# 저장위치 확인
/root/dowork/python-projects/loganalysis/venv/lib/python3.7/site-packages
# DB연결 테스트해보기
(venv) [root@localhost loganalysis]# vi test_connect.py
# test_connect.py editing
import psycopg2
try:
conn = psycopg2.connect(
user='webdb',
password='webdb',
host='192.168.1.49',
port='5432',
database='webdb')
cursor = conn.cursor()
cursor.execute('select version()')
record = cursor.fetchone()
print(f'connected to - {record}')
except Exception as e:
print('error: {0}'.format(e))
finally:
# conn이 살아 있으면 conn.close()
'cursor' in locals() and cursor and cursor.close()
'conn' in locals() and conn and conn.close()
:wq
#
# 라이브러리 로딩 실패로 인하여 오류 발생
(venv) [root@localhost loganalysis]# python test_connect.py
Traceback (most recent call last):
File "test_connect.py", line 1, in <module>
import psycopg2
File "/root/dowork/python-projects/loganalysis/venv/lib/python3.7/site-packages/psycopg2/__init__.py", line 50, in <module>
from psycopg2._psycopg import ( # noqa
ImportError: libpq.so.5: cannot open shared object file: No such file or directory
# 오류 확인
ldconfig -v | grep libpd.so.5
![libpq.so.5 해결](http://www.leeladharan.com/importerror-psycopg-so:-undefined-symbol:-lo-truncate64)
cd /usr/lib64
rm libpq.so.5
ln -s /usr/local/cafe24/pgsql/lib/libpq.so.5 libpq.so.5
# 오류 해결 후 다시 간단하게 pgsql 연결 테스트
[root@localhost loganalysis]# source venv/bin/activate
(venv) [root@localhost loganalysis]# source venv/bin/activate
(venv) [root@localhost loganalysis]# python test_connect.py
connected to - ('PostgreSQL 10.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23), 64-bit',)
2-3 pgsql_crud project test
- 로컬에서 개발 및 테스트 후 git에 업로드
# 1). git에 push
pycharm에서 pgsql_crud 프로젝트를 생성 후 git으로 commit.
단 venv, .idea파일은 제외함
# 2). pycharm 프로젝트에서 commit 된 파일 git clone으로 리눅스에 가져오기
[root@localhost python-projects]# git clone https://github.com/MaximSungmo/pgsql_crud.git
# 3). 패키지 의존성 파일 생성, venv를 따로 git에 올리지 않는 이유임
# pycharm에서 아래의 명령어 terminal로 입력 후 실행하여 txt파일 확인
pip freeze > requirements.txt
--> commit, patch, commit-push
# 4). linux에서 git clone 생성, 이미 가져왔다면 업데이트 하기
# 업데이트방법 : git pull
# 5). 새롭게 가져온 리눅스 폴더virtualenv venv 생성 작업 실시 (venv isolationize)
virtualenv venv
# 6). 의존성 설치
[root@localhost pgsql_crud]# source venv/bin/activate
source venv/bin/activate
# 고립된 환경인 venv에서 설치하기
(venv) [root@localhost pgsql_crud]# pip install -r requirements.txt
# 7). 실행하기
(venv) [root@localhost pgsql_crud]# python test_crud.py
# git 에서 python 프로젝트 다운받은 후 실행 시
# project를 가져온 후 terminal에서 아래의 명령어 실행
pip install -r requirements.txt
2-4 pgsql_crud project의 test_crud.py를 고립시키지 않고 실행
- 개발된 파이썬 source를 다운 받아서 실행만 시키는 것, 다만 위치가 달라질 수 있음.
- venv는 사용자가 다운로드 받아서 실행할 때 만들 필요가 없음. 사용자는 다운 후 실행만 시켜야함.
- 따라서 venv는 개발단계에서 다 완성이 될 수 있도록 작업이 필요함.
임시 해결하는 방법(아래 내용에 상세한 과정 설명하였음)
[root@localhost python-projects]# export PYTHONPATH='/root/dowork/python-projects/pgsql_crud/venv/lib/python3.7/site-packages'
linux에서 프로젝트의 virtual env을 빠져나와서 메인 py파일 실행 시에는 import 오류가 발생한다.
pycharm에서는 이를 아래의 스크립트로 실행 시 작동한다.
import sys; print('Python %s on %s' % (sys.version, sys.platform))
sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS])
즉, 현재 디렉토리에서 실행되는 파일이 디렉토리에서 다른 공간에 있으므로 sys.path를 통해서 위치를 잡아줘야한다.
[root@localhost python-projects]# python3 pgsql_crud/test_crud.py
Traceback (most recent call last):
File "pgsql_crud/test_crud.py", line 1, in <module>
import psycopg2
ModuleNotFoundError: No module named 'psycopg2'
# PYTHONPATH를 추가
[root@localhost python-projects]# export PYTHONPATH='/root/dowork/python-projects/pgsql_crud/venv/lib/python3.7/site-packages'
[root@localhost python-projects]# python3 pgsql_crud/test_crud.py
('강아지', 'ksm5318', '미니핀', 'F', datetime.date(2019, 3, 16), None)
('Fluffy', 'Harold', 'cat', 'f', datetime.date(1993, 2, 4), None)
('Claws', 'Gwen', 'cat', 'm', datetime.date(1994, 3, 17), None)
('Buffy', 'Harold', 'dog', 'f', datetime.date(1989, 5, 13), None)
('Fang', 'Benny', 'dog', 'm', datetime.date(1990, 8, 27), None)
('Bowser', 'Diane', 'dog', 'm', datetime.date(1979, 8, 31), datetime.date(1995, 7, 29))
('Chirpy', 'Gwen', 'bird', 'f', datetime.date(1998, 9, 11), None)
('Whistler', 'Gwen', 'bird', None, datetime.date(1997, 12, 9), None)
('Slim', 'Benny', 'snake', 'm', datetime.date(1996, 4, 29), None)
('기리기리', 'asd', '시츄', 'm', datetime.date(2010, 1, 10), None)
=============
('강아지', 'ksm5318', '미니핀', 'F', datetime.date(2019, 3, 16), None)
('Fluffy', 'Harold', 'cat', 'f', datetime.date(1993, 2, 4), None)
('Claws', 'Gwen', 'cat', 'm', datetime.date(1994, 3, 17), None)
('Buffy', 'Harold', 'dog', 'f', datetime.date(1989, 5, 13), None)
('Fang', 'Benny', 'dog', 'm', datetime.date(1990, 8, 27), None)
('Bowser', 'Diane', 'dog', 'm', datetime.date(1979, 8, 31), datetime.date(1995, 7, 29))
('Chirpy', 'Gwen', 'bird', 'f', datetime.date(1998, 9, 11), None)
('Whistler', 'Gwen', 'bird', None, datetime.date(1997, 12, 9), None)
('Slim', 'Benny', 'snake', 'm', datetime.date(1996, 4, 29), None)
=============
(venv) [root@localhost python_crawler]# export PYTHONPATH=''
# 위에서 설정한 PYTHONPATHG 초기화
실제 해결 방법
venv를 따로 만들지 않고
디렉토리 구조
기존1
python_projects/
|-/pgsql_crud
|- test_crud.py
|- requirements.txt
...
|- venv
|- Lib
|- site-package
|- psycopg2 (여기의 py파일을 import하는 것이므로 현재 상황에서 불가능)
reqirements.txt - Target 지정해주기
점진적 venv 설치를 위한 작업
기존에 업로드된 git을 날린다.
(settings - version control - [-] 로 날리기
E:\cafe24\PycharmProjects\python_crawler에서 .git 디렉토리 날리기)
프로젝트 소스 가져오기
[root@localhost python_crawler]# virtualenv venv
[root@localhost python_crawler]# source venv/bin/activate
(venv) [root@localhost python_crawler]# git pull
(venv) [root@localhost python_crawler]# pip install -r requirements.txt
- 소스 변경되어 venv가 변경되는 경우 점진적 작업을 위하여 다시 소스 가져온 후 venv 추가 설치
(venv) [root@localhost python_crawler]# git pull
(venv) [root@localhost python_crawler]# pip install -r requirements.txt
추가 예정
PYTHONPATH를 따로 설정하지 않고 venv환경이 아닌 상태에서 python 실행시킬 수 있도록 작업
2019-07-02 추가 update
사전작업
# 모듈이 실행되고 있는 디렉토리 구하기
BASE_DIR = (os.path.dirname(os.path.abspath(__file__)))
또는
# 위치를 리눅스 내 절대경로로 지정하기
RESULT_DIR = '/home/webmaster/crawling-results/'
프로젝트는 ZIP으로 만들어질 예정이므로 프로젝트 밖으로 저장될 파일 위치를 설정한다.
- python 설치 시 python application 실행
venv 환경이 아닌 외부에서 파이썬 실행 시 에러 발생
[root@localhost python-projects]# python3 python_crawler/
Traceback (most recent call last):
File "/usr/local/cafe24/python3.7/lib/python3.7/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/usr/local/cafe24/python3.7/lib/python3.7/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "python_crawler/__main__.py", line 6, in <module>
import numpy as np
ModuleNotFoundError: No module named 'numpy'
venv에 해당하는 패키지를 import하여 가져올 수 없기 때문에 에러 발생함
1) 해결 방법
1-1) export PYTHONPATH=‘application 의존성 경로’
python 프로젝트를 분리하여 다음과 같이 파일 분리
[root@localhost python-projects]# ls
loganalysis loganalysis2 pgsql_crud python_crawler
[root@localhost python-projects]# mv python_crawler/ python_crawler_venv
[root@localhost python-projects]# ls
loganalysis loganalysis2 pgsql_crud python_crawler_venv
[root@localhost python-projects]# git clone https://github.com/MaximSungmo/python_crawler.git
[root@localhost python-projects]# pip3 install -r python_crawler/requirements.txt --target=python_crawler/packages
[root@localhost python-projects]# cd python_crawler
[root@localhost python_crawler]# ls
__main__.py __results__ __test__ collection packages requirements.txt
[root@localhost python-projects]# export PYTHONPATH='/root/python-projects/python_cralwer/packages'
[root@localhost python-projects]# python3 python_crawler
[root@localhost python-projects]# ls
loganalysis loganalysis2 pgsql_crud python_crawler python_crawler_venv
[root@localhost python-projects]# mv python_crawler python_crawler_pkg
1-2) export PYTHONPATH를 하지 않고 작업하기 (requirements.txt에 import packages의 py파일들이 python_crawler 바로 밑에 존재하도록 만들기)
[root@localhost python-projects]# git clone https://github.com/MaximSungmo/python_crawler.git
[root@localhost python-projects]# pip3 install -r python_crawler/requirements.txt --target python_crawler
[root@localhost python_crawler]# ls -l
합계 216
drwxr-xr-x 2 root root 4096 2019-07-02 10:32 Django-2.2.2.dist-info
drwxr-xr-x 4 root root 4096 2019-07-02 10:32 PIL
drwxr-xr-x 2 root root 4096 2019-07-02 10:32 Pillow-6.0.0.dist-info
-rw-r--r-- 1 root root 8692 2019-07-02 10:31 __main__.py
drwxr-xr-x 2 root root 4096 2019-07-02 10:32 __pycache__
drwxr-xr-x 2 root root 4096 2019-07-02 10:31 __results__
drwxr-xr-x 2 root root 4096 2019-07-02 10:31 __test__
drwxr-xr-x 2 root root 4096 2019-07-02 10:32 beautifulsoup4-4.7.1.dist-info
drwxr-xr-x 3 root root 4096 2019-07-02 10:32 bin
drwxr-xr-x 5 root root 4096 2019-07-02 10:32 bs4
......................................................
drwxr-xr-x 6 root root 4096 2019-07-02 10:32 urllib3
drwxr-xr-x 2 root root 4096 2019-07-02 10:32 urllib3-1.25.3.dist-info
[root@localhost python_crawler]# cd..
[root@localhost python-projects]# pip3 install -r python_crawler/requirements.txt --target python_crawler
[root@localhost python-projects]# python3 python_crawler
# 정상적으로 실행
1.3) 1.2 작업을 한 뒤에 압축(packaging)하여 실행
[root@localhost python-projects]# python3 -m zipapp python_crawler
[root@localhost python-projects]# ls -l
합계 24
drwxr-xr-x 3 root root 4096 2019-07-01 11:43 loganalysis
drwxr-xr-x 3 root root 4096 2019-07-01 11:30 loganalysis2
drwxr-xr-x 5 root root 4096 2019-07-01 13:40 pgsql_crud
drwxr-xr-x 45 root root 4096 2019-07-02 10:34 python_crawler
drwxr-xr-x 7 root root 4096 2019-07-02 10:25 python_crawler_pkg
drwxr-xr-x 8 root root 4096 2019-07-02 10:19 python_crawler_venv
[root@localhost python-projects]# python3 -m zipapp python_crawler
[root@localhost python-projects]# ls -l
합계 224228
drwxr-xr-x 3 root root 4096 2019-07-01 11:43 loganalysis
drwxr-xr-x 3 root root 4096 2019-07-01 11:30 loganalysis2
drwxr-xr-x 5 root root 4096 2019-07-01 13:40 pgsql_crud
drwxr-xr-x 45 root root 4096 2019-07-02 10:34 python_crawler
-rw-r--r-- 1 root root 229579279 2019-07-02 10:46 python_crawler.pyz
drwxr-xr-x 7 root root 4096 2019-07-02 10:25 python_crawler_pkg
drwxr-xr-x 8 root root 4096 2019-07-02 10:19 python_crawler_venv
[root@localhost python-projects]# python3 python_crawler
# numpy때문에 에러가 발생 추후 해결이 필요함.
# 현재 해결하지 못함
1.4 실행 가능한 파일로 packaging 하기
# numpy 제거하고 실행하면 실행 가능
# pandas 포함
[root@localhost python-projects]# git clone https://github.com/MaximSungmo/python_crawler.git
[root@localhost python-projects]# pip3 install -r python_crawler/requirements.txt --target python_crawler
[root@localhost python-projects]# python3 -m zipapp -p "/usr/local/cafe24/python3.7/bin/python3" python_crawler
[root@localhost python-projects]# python3 python_crawler
git 작업
.gitignore 파일생성
# .gitignore 파일
# 내용
venv/
.idea/
git rm -r --cached .
git add .
git commit -m “message”