반응형

Python 은 다양한 버전의 패키지 라이브러를 사용하여 개발한다. 그렇기 때문에 똑같은 패키지라도 서로 다른 버전을 사용한 프로그램이 있을 수 있어 버전 충돌이 일어날 수 있다.

결국 각 프로그램마다 고유한 개발 환경이 필요한데 그것이 바로 Virtual Envrionment 이다. 여기서는 Mac 에 python 가상 환경을 구축하는 방법을 설명한다.

 

1. Python 설치

 

mac 에서는 brew 로 프로그램 관리를 쉽게 할 수 있는데 brew 로 설치한 python 은 향후 다른 프로그램과 연계할 때 문제가 발생할 수 있어 수동으로 설치하기 위해 이전 brew 설치한 python 은 삭제한 후 아래와 같이 수동으로 다운 받아 설치한다.

(다운로드 후 설치) https://www.python.org/ftp/python/3.9.7/python-3.9.7-macos11.pkg

 

설치한 python 경로에 path 를 확인하고 없으면 추가해 준다. zsh 외에 bash shell 을 사용하면 ~/.bash_profile 을 확인하면 된다.

$ vi ~/.zshrc
export PATH="/Library/Frameworks/Python.framework/Versions/3.9/bin:${PATH}"

$ source ~/.zshrc

 

 

python 설치가 완료되면 아래와 같이 pip 을 설치한다.

$ wget https://bootstrap.pypa.io/get-pip.py
$ python3 get-pip.py

 

 

2. Python 가상 환경 프로그램 설치

 

python 가상 환경은 virtualenv 와 virtualenvwrapper 프로그램을 설치해서 만들 수 있다. 아래와 같이 2개의 툴을 설치한다.

$ sudo pip install virtualenv virtualenvwrapper

 

설치가 완료되면 ~/.zshrc 혹은 ~/.bash_profile 파일에 경로를 추가한다.

$ vi ~/.zshrc

alias python="/usr/local/bin/python3"

export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python3
export VIRTUALENVWRAPPER_VIRTUALENV=/Library/Frameworks/Python.framework/Versions/3.9/bin/virtualenv
export WORKON_HOME=~/.virtualenvs
. /Library/Frameworks/Python.framework/Versions/3.9/bin/virtualenvwrapper.sh
export PATH="/Library/Frameworks/Python.framework/Versions/3.9/bin:${PATH}"

$ source ~/.zshrc

 

3. 가상 환경 활용

 

가상 환경은 아래 명령어로 생성할 수 있다. 마지막 python 옵션은 생략 가능하며 pandas-py3.6 이라는 이름으로 생성하였다.

$ mkvirtualenv pandas-py3.6 --python=python3

venv:(pandas-py3.6) $

 

prompt 가 “venv:...” 로 변경되어 가상환경에 들어와 있음을 알 수 있다.
생성한 가상 환경은 아래 디렉토리에 생성되고 앞으로 pip 으로 생성한 python 패키지 파일들은 ~/.virtualenvs/pandas-py3.6 아래에 설치된다.

venv:(pandas-py3.6) $ ls -al ~/.virtualenvs

drwxr-xr-x  21 ahnsk  staff   672  1 27 10:01 .
drwxr-xr-x+ 96 ahnsk  staff  3072  2 10 13:13 ..
-rwxr-xr-x   1 ahnsk  staff   135 11 13  2017 get_env_details
-rw-r--r--   1 ahnsk  staff    96 11 13  2017 initialize
drwxr-xr-x   8 ahnsk  staff   256  1 27 10:08 pandas-py3.6
-rw-r--r--   1 ahnsk  staff    73 11 13  2017 postactivate
-rw-r--r--   1 ahnsk  staff    75 11 13  2017 postdeactivate
-rwxr-xr-x   1 ahnsk  staff    66 11 13  2017 postmkproject
-rw-r--r--   1 ahnsk  staff    73 11 13  2017 postmkvirtualenv
-rwxr-xr-x   1 ahnsk  staff   110 11 13  2017 postrmvirtualenv
-rwxr-xr-x   1 ahnsk  staff    99 11 13  2017 preactivate
-rw-r--r--   1 ahnsk  staff    76 11 13  2017 predeactivate
-rwxr-xr-x   1 ahnsk  staff    91 11 13  2017 premkproject
-rwxr-xr-x   1 ahnsk  staff   130 11 13  2017 premkvirtualenv
-rwxr-xr-x   1 ahnsk  staff   111 11 13  2017 prermvirtualenv

 

가상 환경을 벗어나려면 deactivate 명령어로 빠져 나오면 된다.

venv:(pandas-py3.6) $ deactivate
$ 

 

가상 환경 목록을 확인하려면 lsvirtualenv 명령어로 할 수 있다.

$ lsvirtualenv

pandas-py3.6
============

 

해당 가상 환경으로 들어가려면 workon 명령어로 할 수 있다.

$ workon pandas-py3.6

venv:(pandas-py3.6) $  python
Python 3.9.7 (v3.9.7:1016ef3790, Aug 30 2021, 16:25:35)
[Clang 12.0.5 (clang-1205.0.22.11)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
반응형
Posted by seungkyua@gmail.com

댓글을 달아 주세요

반응형

1. Dictionary 안에 Dictionary 가져올 때

scheduler_hints = filter.properties.get('scheduler_hints') or {}

group = scheduler_hints.get('group', None)


or


if snapshot:

    try:

        availability_zone = snapshot['volume']['availability_zone']

    except (TypeError, KeyError):

        pass


2. Dictionary arguments 로 부터 가져올 때

execute(self, context, **kwargs):

    scheduler_hints = kwargs.pop('scheduler_hints', None)


3. exception 처리

try:

    ...

    return {

        'reservation': reservations,

    }

except exception.OverQuota as e:

    overs = e.kwargs['overs']

    quotas = e.kwargs['quoata']

    if _is_over('gigabytes'):

        msg = _(Quota exeeded for %(s_pid)s.")

        LOG.warn(msg % {'s_pid : context.project_id})

        raise exception.VolumeSizeExeedsAvailableQuota(

            requested=zise)

    elif _is_over('volumes'):

        raise exception.VolumeLimitExceeded(allowed=quotas['volumes'])

    else:

        raise


4. package 아래 특정 파일을 default 로 지정하는 방법

[ package 구조 ]

-- cinder

    -- db

        -- __init__.py

        -- api.py

        -- base.py


db 아래의 api.py 의 quota_get() function 을 호출하고자 할 때


cinder/db/__init__.py 에 다음과 같이 설정

from cinder.db.api import *


사용하고자 하는 파일에서 다음과 같이 사용

from cinder import db

...

db.quata_get()


혹은

[ package 구조 ]

-- nova

    -- virt

        -- libvirt

            -- __init__.py

            -- driver.py    (여기에 LibvirtDriver 클래스를 사용하고자 함)

            -- vif.py


nova/virt/libvirt/__init__.py 에 다음과 같이 설정

from nova.virt.libvirt import driver

LibvirtDriver = driver.LibvirtDriver


이렇게 설정하면 nova.virt.libvirt.LibvirtDriver 클래스를 읽어들어서 사용할 수 있음


5. dictionary 가 null 일 수 있을 때 null 을 회피하고 기본{} 값을 넣는 법

migrate_data = dict(migrate_data or {})


6. set 기본값 생성

block_device_mapping = set()


7. String 합치기, String 좌우 스페이스를 없애기

import_value = "%s.%s" % (name_space, import_str)

s = s.strip()


8. String 을 특정 delemeter 로 우측 string 을 구분하기, String 을 delemeter로 구분하여 List 에 담기

mod_str, _sep, class_str = import_str.rpartition('.')

flaglist = CONF.libvirt.live_migration_flag.split(',')


9. class 나 function 자체를 변수에 넣고 사용하고 싶을 때

getattr(import 모듈경로, 클래스명)   => .py 파일에 class 가 있을 때

getattr(import 모듈경로, 함수명)      => .py 파일에 def 함수가 바로 있을 때


__import__('nova.virt.libvirt')            => 모듈을 import

class_LibvirtDriver = getattr(sys.modules['nova.virt.libvirt'], 'LibvirtDriver')    +. 클래스를 로딩하여 리턴


10. xml 파싱

from lxml import etree


doc = etree.fromstring(xml)

disk_nodes = doc.findall('.//devices/disk')


11. list 를 순번과 값으로 순차적으로 가져오기

for cnt, path_node in enumerate(['a', 'b'])

print cnt

print path_node



12. list 를 Json string 으로 만들기

from nova.openstack.common from jsonutils


disk_info = []

disk_info.append({'type': 'block',

                          'path': '/dev/disk/by-path/ip-192.168.230.136:3260-iscsi-iqn.2010-10.org.openstack:volume-1000de04-6603-41d8-bae4-7bc16af0bc15-lun-1',

                          'virt_disk_size': 0,

                          'backing_file': '',

                          'over_committed_disk_size': 0})

disk_info = jsonutils.dumps(disk_info)


13. Class 를 Json String 으로 만들기

from nova.openstack.common from jsonutils


instance = jsonutils.to_primitive(instance)


14. 리스트의 내용을 조건절로 걸러내고 새로운 리스트에 담기

bdms = [bdm.legacy() for bdm in block_device_mapping if _has_legacy(bdm)]


15. 로직 중간에 새로운 쓰레드 생성하기

from eventlet import greenthread


greenthread.spawn(self._live_migration, context, instance, dest .......)


def _live_migration(self, context, instance, dest .......)


16. list 의 값을 하나의 string 으로 만들기

cmd = ('ssh', 'host')

cmd = ' '.join(cmd)






반응형
Posted by seungkyua@gmail.com

댓글을 달아 주세요

반응형

1. RabbitMQ 의 흐름은 다음과 같다.


Producer -> Exchange -> Queue  -> Consumer

                                -> Queue


2. Exchange 의 타입

    - Direct exchange    : routing_key 로 일치하는 consumer 만 연결

    - Fan-out exchange : 모든 consumer 와 연결

    - Topic exchange    : *, # 을 사용하여 매치되는 consumer 와 연결

                                   *.stock.#   ->  us.stock(O),   eur.stock.db(O), stock.nasdaq(X)






반응형
Posted by seungkyua@gmail.com

댓글을 달아 주세요

반응형


1. Mac 에서 python setup.py install 실행시 저장되는 경로

/Library/Python/2.7/site-packages


2. package 만들기

python setup.py sdist


3. src install

python setup.py install --record files.txt


3. src 를 pip으로 install

pip install -e .


5. src uninstall

cat files.txt | xargs rm -rf


6. pip require package install

pip install -r pip-requires


7. pip installed package list

pip freeze


8. pip package uninstall

pip uninstall package-name














반응형
Posted by seungkyua@gmail.com

댓글을 달아 주세요

반응형

파이썬에서 eventlet 모듈로 쓰레드를 사용하고 싶다면 세가지 방법이 있습니다.


1. eventlet.tpool 을 사용

    - 가장 간단한 방법으로 eventlet.tpool.execute(function(), ...) 방식으로 쓰레드를 생성하여 호출.

      pool 을 사용하며 쓰레드 20개가 기본.

      pool 사이즈를 늘릴려면 환경변수 EVENTLET_THREADPOOL_SIZE 의 값을 변경


2. eventlet 을 사용

    - eventlet.spawn(function(), ...) 을 사용하여 쓰레드를 생성하여 호출

      리턴값으로 eventlet.greenthread.GreenThread 가 리턴됨.

      pool 을 사용할 수 없음


3. eventlet.greenpool 을 사용

    - eventlet.greenpool.GreenPool.spawn(function(), ...) 을 사용하여 쓰레드를 생성하여 호출

      리턴값으로 eventlet.greenthread.GreenThread 가 리턴됨.

      pool 사용이 가능



반응형
Posted by seungkyua@gmail.com

댓글을 달아 주세요

반응형
python 에서 argv 를 이용하여 args 를 동적으로 추가하고자 한다면 다음과 같이 사용

1. sys.argv[1:] 를 이용
   -  main 의 프로그램명을 제외한 cli 에서 입력한 argv 가 입력됨

2.  argparse.ArgumentParser.add_argument 를 이용하여 환경설정 값을 args 로 추가
반응형
Posted by seungkyua@gmail.com
TAG args, argv, Python

댓글을 달아 주세요

반응형
1. Python 설치
    . http://www.python.org/download/ 

2. Pydev 설치
    . update site : http://pydev.org/updates
    . eclipse -> Window -> Preferences -> Interpreter-Python에서 New 에서  python.exe 의 경로를 찾아 선택

3. Python 환경변수 및 패스 설정
    . Windows
        환경변수명 : PYTHONPATH
        환경변수값 : %PYTHONPATH%;C\Python32
        패스추가    : C\Python32

    . Mac
        환경변수 추가 : export PYTHONPATH=/Library/Python/2.6

반응형
Posted by seungkyua@gmail.com

댓글을 달아 주세요

반응형
1. 수치형 (Numbers)
    . int, long. complex, float 
    . type : IntType, LongType, ComplexType, FloatType

2. 문자열 (Strings)
    . 문자들의 집함, 내용 변경이 안됨
    . 'spams', "ham"
    . type : StringType

3. 리스트 (Lists)
    . 순서를 가지는 객체의 집합
    . ['ham', 'spam']
    . type : ListType

4. 사전 (Dictionaries)
    . 순서를 가지지 않는 객체의 집합. 키-값(key-value) 로 저장
    . {'ham':4, 'spam':5}
    . type : DictionaryType

 5. 튜플 (Tuples)
    . 순서를 가지는 파이썬 임의 객체의 집합이다. 내용 변경이 안됨
    . ('ham', 'spam')
    . type : TupleType

5. 파일 (Files)
    . 파일에 자료를 입 출력하기 위한 객체이다.
    . f = open('ham')
    . type : FileType

6. None
    . null 을 의미
    . type : NoneType





반응형
Posted by seungkyua@gmail.com

댓글을 달아 주세요