반응형
.
├── config
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-39.pyc
│   │   ├── settings.cpython-39.pyc
│   │   ├── urls.cpython-39.pyc
│   │   ├── views.cpython-39.pyc
│   │   └── wsgi.cpython-39.pyc
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
├── db.sqlite3
├── firstapp
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-39.pyc
│   │   ├── urls.cpython-39.pyc
│   │   └── views.cpython-39.pyc
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
└── manage.py

위와 같이 django 디렉토리가 있을 때 package, module import 하는 방법이 헷갈려서 정리하는 차원이다.

 

바로 하위 디렉토리 config 와 firstapp 은 패키지 이다.

그리고 config 아래의 urls.py 와 같은 python 파일은 모듈이다.

 

import 방법은 다음과 같다.

 

 

import {패키지}.{모듈}

import {패키지}.{모듈}.{함수}

 

from {패지키} import {모듈}

from {패키지}.{모듈} import {함수}

 

 

 

 

 

반응형
Posted by seungkyua@gmail.com
,
반응형

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. Django 설치하기

$ sudo apt-get install python-django

$ django-admin.py --version


2. Django 프로젝트 만들기

$ django-admin.py startproject django_example


3. Database 연동

$ vi django_example/settings.py


 12 DATABASES = {

 13     'default': {

 14         'ENGINE': ''django.db.backends.sqlite3',

 15         'NAME': 'exampledb',

 16         'USER': '',

 18         'PASSWORD': '',

 19         'HOST': '',

 20         'PORT': '',

 21     }

 22 }


$ python manage.py syncdb


4. 서버 실행

- 서버는 기본으로 8000 번 포트로 실행되므로 포트를 생략할 수 있다.

   $ python manage.py runserver <8000>


5. 프로젝트 만들기

$ python manage.py startapp example


6. view 작성

$ vi example/views.py


  1 # -*- coding: utf-8 -*-      (다국어 표현을 위한 주석)

  2

  3 # Create your views here.

  4 from django.http import HttpResponse

  5

  6 def main_page(request):

  7     output = '''

  8         <html>

  9         <head><title>%s</title></head>

 10         <body>

 11             <h1>%s</h1>

 12         </body>

 13         </html>

 14     ''' % (

 15         'Django Example',

 16         'Hello World !!'

 17     )

 18     return HttpResponse(output)


7. URL 과 view 매핑

$ vi django_example/urls.py


  1 from django.conf.urls import patterns, include, url

  2 from example.views import *

  3

  4 urlpatterns = patterns('',

  6     (r'^$', main_page),

  7 )


8. Model 만들기

- Model 에서 사용하는 Field type

   IntegerField

   TextField

   CharField

   DateTimeField

   EmailField

   URLField

   FileField


- Department 모델 만들기

   $ vi example/models.py


  1 from django.contrib.auth.models import User

  2 from django.db import models

  3

  4 class Department(models.Model):

  5     department_name = models.TextField()

  6     user = models.ForeignKey(User)


- settings 파일에 INSTALLED_APPS 에 APP 을 등록하여 model 활성화

   $ vi django_example/settings.py


116 INSTALLED_APPS = (

117     'django.contrib.auth',

118     'django.contrib.contenttypes',

119     'django.contrib.sessions',

120     'django.contrib.sites',

121     'django.contrib.messages',

122     'django.contrib.staticfiles',

123     'example',

128 )


- Model DB 테이블 생성

   $ python manage.py syncdb


- DDL 문 SQL 확인

   $ python manage.py sql example


- Data 저장 및 확인

   $ python manage.py shell


>>> from example.models import *

>>> from django.contrib.auth.models import User

>>> User.objects.all()


>>> user = User.objects.get(id=1)

>>> print user

>>> dir(user)


>>> department1 = Department(department_name='Cloud Team', user=user)

>>> department1.save()


9. Template 만들기

- template 디렉토리 지정하기

   $ mkdir -p templates

   $ vi django_example/settings.py


  3 import os.path

     ...

112 TEMPLATE_DIRS = (

113     os.path.join(os.path.dirname(__file__), '../templates'),

114 )


- template 파일 만들기

   $ vi templates/main_page.html


  1 <html>

  2 <head><title>{{ title }}</title></head>

  3 <body>

  4     <h1>{{ greeting }}</h1>

  5 </body>

  6 </html>


- view 파일 수정

   $ vi example/views.py


  1 # -*- coding: utf-8 -*-

  2

  3 from django.http import HttpResponse

  4 from django.template import Context

  5 from django.template.loader import get_template

  6

  7 def main_page(request):

  8     template = get_template('main_page.html')

  9     variables = Context({

 10         'title': 'My Example',

 11         'greeting': 'Hello Stephen !!',

 12     })

 13     output = template.render(variables)

 14     return HttpResponse(output)


10. 복잡한 화면 만들기

- url 을 user/username 형식으로 매핑 (username 은 stack 이라는 user 명을 사용)

   $ vi django_example/urls.py


  8 urlpatterns = patterns('',

  9     (r'^$', main_page),

 10     (r'^user/(\w+)/$', user_page),

 11 )


- view 를 수정

   $ vi example/views.py


  3 from django.contrib.auth.models import User

  4 from django.http import Http404


 18 def user_page(request, username):

 19     try:

 20         user = User.objects.get(username=username)

 21     except:

 22         raise Http404('Cant not found user')

 23

 24     dept = user.department_set.all()

 25

 26     template = get_template('user_page.html')

 27     variables = Context({

 28         'username': username,

 29         'department': dept,

 30     })

 31     output = template.render(variables)

 32     return HttpResponse(output)


- page 생성

   $ vi templates/user_page.html


  1 <html>

  2 <head><title>User: {{ username }}</title></head>

  3 <body>

  4     <h1>{{ username }}'s Department</h1>

  5     {% if department %}

  6         <ul>

  7             {% for dept in department %}

  8                 <li>{{ dept.department_name }}</li>

  9             {% endfor %}

 10         </ul>

 11     {% else %}

 12         <p>There's is no department</p>

 13     {% endif %}

 14 </body>

 15 </html>





반응형
Posted by seungkyua@gmail.com
,
반응형

I. import 모듈

import eventlet.patcher
eventlet.patcher.monkey_patch()

import eventlet.db_pool
import sqlalchemy.orm
import sqlalchemy.pool

try:
    import MySQLdb
except ImportError:
    MySQLdb = None

II. orm sessionmaker 함수를 통한 session 생성

session = sqlalchemy.orm.sessionmaker(bind=engine,
                                                          autocommit=autocommit,
                                                          expire_on_commit=expire_on_commit)

III. sessionmaker의 첫번째 인수, bind 를 하기 위한 engine 을 생성하는 방법

engine = sqlalchemy.create_engine(FLAGS.sql_connection, **engine_args)

IV. create_engine을 하기 위한 engine_args dict 변수를 만드는 방법

engine_args = {
    "pool_recycle": FLAGS.sql_idle_timeout,
    "echo": False,
}
engine_args["pool_size"] = FLAGS.sql_max_pool_size
engine_args["pool_timeout"] = FLAGS.sql_pool_timeout
engine_args["creator"] = creator.create

V. creator (Connection Pool) 를 구하는 방법

creator = eventlet.db_pool.ConnectionPool(MySQLdb, **pool_args)

VI. ConnectionPool을 구하기 위한 pool_args 변수를 만드는 방법

# sqlalchemy.engine.url.make_url 을 이용하면 url 을 가지고 dict 형태로 변환이 가능하다.
connection_dict = sqlalchemy.engine.url.make_url(FLAGS.sql_connection)

pool_args = {
        "db": connection_dict.database,
        "passwd": password,
        "host": connection_dict.host,
        "user": connection_dict.username,
        "min_size": FLAGS.sql_min_pool_size,
        "max_size": FLAGS.sql_max_pool_size,
        "max_idle": FLAGS.sql_idle_timeout,
}





















 

반응형
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
,
반응형
일반적으로 노바의 로그는 /var/log/nova/nova-xxx.log 형태로 남는다.

/etc/nova/nova.conf 에 보면 logdir=/var/log/nova 로 되어 있어서 해당 디렉토리에 서비스 모듈명의 이름으로 로그가 남는데 이는 프로세스별로 로그를 만드는 것이다.

만약 사용자 정의의 로그를 만들고 싶으면 다음과 같이 수정한다.

# vi /usr/lib/pymodules/python2.6/nova/log.py

def setup():
...
    reset()
    _ask_setup_log()   // 추가
...
askLogger = logging.getLogger('nova.ask')
def _ask_setup_log():

    if FLAGS.logdir:

        logname = '%s.log' % (os.path.join(FLAGS.logdir, 'nova-ask'),)

        global askLogger

        askLogger = logging.getLogger('nova.ask')

        askLogger.propagate = 0

        askHandler = WatchedFileHandler(logname)

        askHandler.setFormatter(_formatter)

        askLogger.addHandler(askHandler)

 
# vi /usr/lib/pymodules/python2.6/nova/scheduler/chance.py

...
from nova import log as logging
...

    logging.askLogger.debug('********* %s, %s *************', context, topic)


이와 같이 수정하면 /var/log/nova/nova-ask.log 가 생성되며 어떤 프로세스에서 호출하던지 해당 로그에 남게 되어 있다.


novaclient 모듈에서 로그를 추가하고 싶으면 다음과 같이 하면 된다.

# vi /usr/lib/pymodules/python2.6/novaclient/log.py

import logging

from logging.handlers import WatchedFileHandler


logger = logging.getLogger('nova.client')

logger.setLevel(logging.DEBUG)

fh = WatchedFileHandler('/var/log/nova/nova-client.log')

formatter = logging.Formatter('%(asctime)s %(levelname)s %(name)s [-] %(message)s from (pid=%(process)d) %(funcName)s %(pathname)s:%(lineno)d')

fh.setFormatter(formatter)

logger.addHandler(fh)


# vi /usr/lib/pymodules/python2.6/novaclient/shell.py

...
from log import logger
...

logger.debug('******* shell.py called !! ****************')







 
반응형
Posted by seungkyua@gmail.com
,