본문 바로가기

Python

[Python 3.7] 리눅스로 시작하기

[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 설치를 위한 작업

  1. 기존에 업로드된 git을 날린다.

    (settings - version control - [-] 로 날리기

    E:\cafe24\PycharmProjects\python_crawler에서 .git 디렉토리 날리기)

  2. 프로젝트 소스 가져오기

[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
  1. 소스 변경되어 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으로 만들어질 예정이므로 프로젝트 밖으로 저장될 파일 위치를 설정한다.
  1. 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”