'Language/python'에 해당하는 글 65건

<pycharm에 대하여>
pycharm.. python IDE 중에서는 가장 큰 것 같고, auto-completion도 나쁘지 않다

키워드 replacement도 있다

replace하는 변수이름이 test처럼 일반적이면 상관없는 키워드들도 다 바꿔버려서 에러를 만드는거나

코드정리를 자기멋대로 해버리고 설정이 불편하고...

어쨌든! 장단점이 있지만 필자는 현재 pycharm을 사용중이다


<run - working directory>

pycharm에서 아래 코드를 실행하였다


with open('file') as f: ...


그런데 그럴리가 없는데 에러가 났다!

아래 코드를 실행해보았더니


import os

print(os.getcwd())

# output: C:\Windows\System32


위와 같이 출력되었다

하고싶은 얘기는 간단하다

pycharm에서 run 했을 때 path, location이 왜 project directory가 아니냐!를 찾아보다가

working directory configuration을 해야한다는 것을 알았다

이 글에서 하고싶은 이야기는 간단하다. run configuration에서 working directory를 설정할 수 있다


실행 화살표 버튼 옆에 왼쪽에 있는 버튼 (ex: 프로젝트 이름일수도 있고, 아닐수도 있고...)을 누르면

Edit Configuration이 나오는데, 거기서 working directory를 project directory로 설정해주면 된다


수정 후 run 했을 때 위 코드는 에러가 발생하지 않고 잘 동작하였다


pycharm은 개인적으로 기본 설정이 필자와 잘 안맞고, 설정도 복잡하게 되어있는것 같다

그렇다고 못쓸정도는 아니지만!

필자처럼 path나 location으로 서치해서 헤매는 사람들이 있을까봐 메모겸, 공유겸 포스팅하였다


'Language > python' 카테고리의 다른 글

python scrapy 한글 인코딩  (0) 2018.03.16
[python] multiprocessing  (0) 2018.01.15
[python] tornado package  (0) 2018.01.01
[python] ctypes: ARRAY vs POINTER 차이/비교  (0) 2018.01.01
[python] == vs is 차이/비교  (0) 2018.01.01

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

tornado: asynchronous networking library, web framework


web framework는 flask, django가 많이 쓰이고

async는 asyncio라는 standard package가 최근 버전에 추가되었다


그렇다고 tornado가 사용되지 않는 것은 아니지만, 기왕이면 필자는 tornado보다는 flask/asyncio를 사용하려 한다




WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

sizeof(c_int*4) # (c_int*4) size

sizeof(POINTER(c_int)) # POINTER size


CFUNCTYPE을 사용할 때는 POINTER를 사용해야 호환된다



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

== -> compare vaule

is -> compare object (memory address)


ex) 

a = 'str'

b = input() # str

a is b # False

a == b # True



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

(1)은 연산식을 작성할 때 사용하는 소괄호로 인식하고

(1,)은 tuple을 생성하는 것이고 인식한다


WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

read()/write()의 parameter/return type이 바뀐다


'r'/'w' -> str type

'rb'/'wb' -> bytes type


WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

python에서 인스턴스 멤버변수를 선언할 때 def __init__(self) 안에서만 할수있다고 알고있었다

그런데 굳이 __init__을 사용하지 않아도 멤버변수를 선언할 수 있었다


1
2
3
4
5
6
class Test1(object):
    def __init__(self):
        self.num = 5
 
class Test2(object):
    num = 5
cs


https://stackoverflow.com/a/26529574

위 링크에 아주 친절하게 설명되어있다


결론은 아래와 같이 간단하게 사용해도 웬만하면 문제없다는 뜻이다

귀찮게 __init__, self를 사용하지 않아도 된다


WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

<virtualenv?>

virtual environment를 만들어주는 패키지다

gradle, maven처럼 프로젝트의 라이브러리 버전을 매니지먼트해준다


<라이브러리 버전 관리?>

virtualenv는 프로젝트에서 라이브러리를 많이 사용할 때, 라이브러리 버전을 관리하기위해 필요해진다

라이브러리 버전 관리는 왜 필요할까?

1. 다른 환경(PC)에서 프로젝트를 개발/실행할 때, library version compatibility issue가 발생하지 않도록 해준다

2. 이 프로젝트에서 사용하는 라이브러리들을 정리하기 간편하다


2번은 virtualenv를 실행하고, 필요한 라이브러리들을 다운받고, 

pip freeze > req.txt

위 커맨드를 통해 req.txt file로 redirection하면 dependency library들의 리스트를 만들수 있다. 그리고

pip install -r req.txt

다른 환경에서 위 커맨드를 통해 필요 라이브러리들을 손쉽게 인스톨할수있다


<사용법>

위에서 virtualenv 사용이유에 대해서 살펴보았다. 이제 사용법을 알아보자

virtualenv venv

위 커맨드를 실행하면 현재 경로에 venv 디렉토리가 생성된다

venv/Scripts/activate

위 커맨드로 venv를 시작할 수 있다

pip freeze

위 커맨드로 venv가 잘 실행되었는지 확인할 수 있다 (인스톨한 라이브러리가 없다고 보여야함)

deactivate

venv를 빠져나올 수 있다


---


<주의>

venv 디렉토리를 생성하고 다른 곳으로 옮겨서 사용하면 제대로 동작하지 않는다

그땐 바뀐 경로에서 다시

virtualenv venv

커맨드를 실행하여 그 경로에 다시 venv를 적용하여야한다


그리고 windows powershell에서는 사용하기 귀찮으므로 cmd를 추천한다

또한 cmd에서는 경로에 / 대신 \(back slash)를 사용하여야한다
(이래서 mac를 쓰나보다)

example: venv\Scripts\activate



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

python class에는 슈퍼클래스에 접근하기 위해 사용하는 super() 메서드가 있다


python3에서는 문제없이 잘 동작하는데, python2는 그렇지 않다


class MyClass: pass


위와 같이 선언하면 super()를 호출할 때 python2에서는 에러가 발생한다 (super()의 파라미터가 type이 아닌 classobj일 때)


그래서 아래와 같이 object를 상속받아 선언해야한다


class MyClass(object): pass


---


python2에서는 super() 등 별도의 목적을 위해,

python3에서는 python2 compatibility를 위해 사용한다 (__future__처럼)


좀더 내부적으로 보면, python2에서 상속없이 선언한 클래스는 old-style class로 선언되기 때문에

new-style class로 선언하기 위해 object 클래스를 상속받는 것이다



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

WSGI는 Web Server Gateway Interface의 약자인데, web server와 web application의 interface 기능을 하는 python framework라고 위키에 설명되어있다

Django, flask는 WSGI를 사용하고있다. 그리고 인증 등을 위해 WSGI의 middleware를 사용하고있다


django보다는 flask가 더 공부하는 재미가 있어서, django에서 사용하던 middleware를 flask로 migrate할 계획이다

진행되면 추가포스팅하도록 하겠다


---


django middleware (create your own middleware)

https://docs.djangoproject.com/ko/2.0/topics/http/middleware/


django deprecation middlewaremixin

https://github.com/django/django/blob/master/django/utils/deprecation.py


flask WSGI 미들웨어에서 후킹하기

http://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html#wsgi

app.wsgi_app = MyMiddleware(app.wsgi_app) # wsgi_app == method



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

[python] Django란?

Language/python 2017. 12. 29. 23:21

<Web Application Framework for python>

Django는 이전 글에서 언급했듯, python으로 작성된 web application framework이다

(이전 글 (Web 개발의 특징 / Django F/W를 사용해보며 느낀 점): http://ssaemo.tistory.com/124)


<Django의 Abstraction>

다른 프레임워크들도 그렇듯, 웹앱 개발을 엄청나게 추상화되어있어 웹앱 아키텍처의 사전지식이 없어도 쉽게 개발할수 있는 것이 장점이다

하지만 양날의 검인 것이, 웹앱 아키텍처에 대해서 잘 알고있어도 프레임워크 사용에 큰 도움은 되지않는다


<MTV Pattern>

Django는 MTV pattern을 사용한다

MTV는 Model, Template, View인데, 


Model은 db table 생성 및 데이터 처리(CRUD)에 사용된다

Model class가 db table이고 instance가 데이터(db row)이다

table 생성은 migrate를 통해서 이뤄지고, CRUD는 queryset이었나?


Template은 presentation logic을 담당하여 HTML 뼈대(skeleton)를 만드는데에 사용된다

rendering(=data binding)은 view에 의해 이뤄진다

(여담으로 Flask는 jinja2 Template engine을 사용하는데 Django는 자체 템플릿 엔진이 있다)


View는 request를 receive하고 적절히 처리하여 response를 send한다

적절한 처리라는 것은, 특정 template에 model로부터 읽어온 data를 binding(rendering)하는 것이다

VIew의 역할은 request를 처리하는 것이다. template, model과 상호작용하여 HTML은 generate하고 response하는 것,


<routing>

Django는 routing 기능도 포함하고 있다

urls.py에 path를 설정하여 적절한 view에 routing한다


<register>

사용해보진 않았는데, Model class를 admin에 register하면

admin page에서 그 Model을 확인하고 관리할 수 있다


<ORM: Object Relational Mapper>

Django의 QuerySet을 의미하는 듯 하다.

Post라는 Model이 있다고 하자. Post.objects.all() 또는 filter() 등의 메서드들을 호출하면 QuerySet이 리턴된다

그럼 QuerySet은 왜 쓰는걸까? 현재까지의 생각으로는, SQL을 몰라도 DB에 Access할수있다는 것이 QuerySet의 기능이다

SQL을 몰라도 DB에 데이터를 저장하고, 읽을 수 있다

그에 따라, DB 변경이 쉬울 것으로 생각된다 (그럴 일이 있을까?)

SQL도 사용할 수 있다. Model.objects.raw(sql)을 사용해서.

QuerySet을 모를때는 이게 어떻게 동작하는지 파악하기가 어려웠다 (프레임워크의 너무 큰 의존성)

가장 큰 문제는, django database engine에 있는 database만 사용할 수 있다는 것이다

Elasticsearch를 DB처럼 사용하고싶어도, django QuerySet을 통해서는 사용할 수 없다

자유도가 낮다고 말할수도 있겠다

어쨌든 Django의 ORM은 QuerySet(Model에 있는)이고, 장점보다는 단점이 더 크게 느껴졌다 개인적으로.


(또 여담. Flask에서 사용하는 SQLAlchemy ORM도 정의된 engine들 한정이다.

db로 elasticsearch를 사용하고싶어서 찾아봤던건데, elasticsearch-py 자체에 ORM 기능이 있어서 필요없을듯

근데 django는 db 세팅이 강제라서 맘에 안듬. 여윽시 flask가 최고시다)


<tutorial>

# install django

pip install django # 현재 최신버전은 2.0


# create a django project

# django를 설치하면 django-admin 커맨드가 생긴다

django-admin startproject mysite .


# 프로젝트 안에 app을 하나 더 생성하려면 이렇게?

django-admin startapp myapp .


프로젝트를 생성하면 manage.py가 생기는데, 이 파일로 project에 command를 실행할 수 있다

migrate, runserver, test 등.


---


<django INSTALLED_APPS>

# 일부 INSTALLED_APPS는 DB를 사용한다. 그러므로 manage.py migrate를 실행해야한다.

# migrate는 DB table 생성 커맨드이다. # makemigrations는 Model 선언 후, migrate 전 실행

https://docs.djangoproject.com/ko/2.0/intro/tutorial02/

# DocType

https://github.com/sabricot/django-elasticsearch-dsl

# sqlite3 in volatile memory

https://stackoverflow.com/questions/39098008/django-rest-framework-without-database


<django Celery task>

== async task queue(background process)

# CELERY_BEAT_SCHEDULE, crontab

 - crontab(minute=0, hour='*/3') # 3시간마다

 - crontab(minute='*/15') # 15분마다

 - crontab(minute=0, hour=0) # 매일 0시0분



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

<What is the Django?>

Django는 Flask와 함께 대표적인 python으로 작성된 Web Application Framework이다

둘의 차이점은 Flask가 더 가볍다는 것인데, 이건 여기서 다루려는 내용은 아니고.

웹 애플리케이션 프로젝트를 맡게되어서 Django를 언급하게 됐다


<Why use the Django?>

개발툴을 고를 때 Node.js(Network Application Development S/W Platform)를 사용하려고 했었는데

이전 버전인 Django를 재개발하는 것이었기 때문에, 기한의 압박을 덜기위해 Django를 사용하게 됐다


Django를 며칠 다뤄보니 알게된 것이 있다

예전에 이미 Flask, Django, Spring, Node.js(얘는 플랫폼) 등 여러 프레임워크들의 기본 기능(라우팅, 뷰 등의 구성)들은 살펴보았지만, 이제 생각해보니 제대로 개발해본 경험이 없었다.

웹보다는 네이티브에 더 흥미가 있었기 때문이다

왜 그랬을까?


<Web 개발의 특징>

이제서야 깨달았는데, 나는 코드레벨 성능/구조 최적화에 가장 흥미가 있다

그러나 Web 개발은 그런 점에서 반대에 있다고 생각한다 (그래서 흥미가 안생겼었는데, 자세한 이유는 잘 못 느꼈다)

Web은 특성상, 성능 최적화보다는 다양한 클라이언트에 대한 Compatibility(호환성)에 더 포커싱되어있다

사용상의 속도이슈 이전에, 사용 가능성 자체의 문제이기 때문이다

그래서 jQuery 라이브러리가 나왔다.

HTML/CSS/JS의 IE, Chrome, Firefox 등 다양한 브라우저를 더 편리하게 지원하기 위해서. (그 외에도 충분히 편리한 기능은 많다)

Client-side의 Static page에는 jQuery가 나온 반면,


Server-side의 Dynamic Page, 즉 Web Application은 PHP, JSP, ASP와 같은 Script Language부터 시작되었다 (그전에 있었던 native binary와 CGI는 스킵하자)

이 언어들은 View와 Data Logic이 분리되어있지 않아서 유지보수에 어려움이 있었다

그래서 MVC 패턴과 함께 Spring과 같은 웹 애플리케이션 프레임워크가 등장하게 되었다

(위 내용들은 오피셜이 아니고 모두 필자의 개인적인 생각들이므로 오해 없기를)

웹 앱 프레임워크는 MVC 패턴을 이용하여 Data Logic과 View를 분리함으로써 유지보수 문제를 해결해주었다


이후 다양한 웹 애플리케이션 프레임워크들의 발전과 함께 Angular, React, Vue와 같은 프론트엔드 프레임워크들도 등장했다

웹 앱 프레임워크 -> 추상화를 통해 웹앱을 점점더 쉽개 개발할수 있도록 발전하였고

프론트엔드 프레임워크 -> 이젠 멀티브라우저보다는 수많은 모바일 디바이스들의 호환성에 포커싱하였다


필자가 생각하는 웹 개발의 역사는 이러한데, 핵심은 이것이다

백엔드/프론트엔드 프레임워크들은 추상화를 통해 웹개발을 더 쉽게 만들고 / 성능보다는 클라이언트 호환성에 포커싱되어있다는 것이다

Django는 심지어 SQL을 몰라도 ORM을 통해 Table을 만들고 데이터 SELECT/INSERT/DELETE까지 할수있는 걸 보고 꽤많이 놀랐다

더 나아가서, 이것은 웹앱 아키텍처를 몰라도 웹앱을 개발할수있게 해주었고, 부정적으로 말하면 프레임워크의 의존성이 너무 커졌다

결국 하고싶은 말은 이것이었다. 프레임워크를 공부해봐야, 다른 프레임워크에 적응하는데에는 거의 도움이 안된다 (2020.05 수정)

서비스 개발관점에서는 최고지만 공부 관점에서는 장점이 하나도 없었다. 그래서 흥미가 없었다

(그리고 심각한 추상화로 인해 프레임워크 구조로부터 실제 동작을 이해/파악하기가 어렵다는 점이 매우 끔찍함. (2020.05 수정)

웹앱 아키텍처를 알아도 프레임워크를 새로 공부해야함)


그리고 계속 말해왔듯이 클라이언트 호환성, 이 외에도 잡다하게 신경쓸 부분들이 너무 많았다 (데이터 로직보다는 뷰의 중요성이 더 큰 느낌)

이것도 필자의 흥미를 저해하는 이유 중 하나였다


<이와중에 Node.js>

Node.js는 Framework가 아니라 Platform이라고 wiki에 설명되어있다. 플랫폼이라고 하는것보다는 프로그래밍 언어라고 하는것이 더 와닿을 것이다.

언어도 하나의 플랫폼이기 때문.

처음에는 Async I/O라는 점 때문에 흥미가 생겼지만 중요한 것은 그것이 아니었다

PLATFORM. 이것은 심각하게 추상화되어있지 않다. 웹앱 아키텍처를 이해하고있다면 Node.js에 굉장히 빠르게 적응할수 있다 (2020.05 수정)

그래서 프레임워크는 서비스 개발자에게, Node.js는 프로그래머에게 더 잘맞는다고 생각한다

Node.js는 공부하는 의미가 있다! 그래서 매우 흥미롭다.

게다가 웹 한정이 아니라 네트워크 애플리케이션 개발을 위한 플랫폼이므로, 사용범위가 더 넓다

그래서 다음에는 꼭 Node.js 프로젝트를 해보려고 한다


<Conclusion>

Django를 사용해보면서, 웹앱 프레임워크의 굉장한 추상화와 불편함을 느끼게 되었다

그래서 왜 그동안 웹개발에 흥미가 없었는지, Node.js에는 왜 흥미가 생겼는지 생각하게 되었고

이 외에 Django, ORM의 목적/기능에 대해서도 생각해보게 되었다 (이것은 기회가되면 나중에 작성하기로)

그래서 그런 주저리 생각들을 서술해보았다

(원래는 Django 사용법에 대해서 정리해놓으려했는데 삼천포로 샜다. 이건 다음 포스팅에.

그리고 글쓸 시간여유좀 있었으면 좋겠다)


---


 (2020.05 수정)


대략 2년 반전에 쓴 글을 다시 읽어보니, 좁은 시각으로 Django는 너무 부정적으로 Node.js는 너무 긍정적으로 써놓았었습니다 ㅋㅋ

글 읽으시는 분들은 이 점 감안해서 읽어주시고 오해 없으시면 합니다.


Django도 좋은 프레임워크이며, 개발 생산성을 높이는 데에 큰 도움을 줍니다. 추상화가 많이 되어있지만 공부를 해보면 어떻게 동작하는지도 알 수 있습니다.


Node.js에도 (아직 사용해보지는 않았지만) Django와 같이 ORM 등을 제공해주는 웹 프레임워크가 있습니다. Node.js를 사용하신다면 ORM같은 부분보다는 싱글 스레드 기반 비동기 아키텍처를 잘 이해하는 것이 중요할 것입니다


글 읽어주셔서 감사합니다

'Language > python' 카테고리의 다른 글

[python] WSGI, Middleware (flask, django)  (0) 2017.12.29
[python] Django란?  (0) 2017.12.29
[python] 추상클래스(abstract class) - abc module  (0) 2017.12.16
[python] logging example  (0) 2017.12.16
[python] unittest library - simple example  (0) 2017.12.15

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

<code example>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from abc import *
 
class PQBase(ABC):
    @abstractmethod
    def add(self, item):
        pass
    
    @abstractmethod
    def remove_min(self):
        pass
 
class PQ(PQBase): # implements by unordered list
    def __init__(self):
        self._pq = []
        
    def add(self, item):
        self._pq.append(item)
    
    def remove_min(self):
        pq = self._pq
        
        min = pq[0]
        for i in pq:
            if min > i:
                min = i
 
        pq.remove(min)
        return min
    
    def is_empty(self):
        return len(self._pq) == 0
 
if __name__ == '__main__':
    pq = PQ()
    pq.add(5)
    pq.add(3)
    pq.add(1)
    pq.add(2)
    pq.add(4)
 
    while not pq.is_empty():
        print(pq.remove_min())
cs


1. ABC 클래스를 상속(derive)받는다

2. 필수구현 메서드에 @abstractmethod 데코레이터?를 사용한다


<etc>

작은 규모에서는, 굳이 abc module을 사용하지않고 메서드 각각에

raise Exception('Not Implemented')

를 사용하여 구현하여도 큰 차이 없을듯 하다


multiple inherit class의 경우에는 conflict를 방지하기 위해 ABC 대신 metaclass=ABCMeta를 사용한다는 듯 하다

위 예제 기준에서는 ABC 상속만으로도 충분하다

'Language > python' 카테고리의 다른 글

[python] Django란?  (0) 2017.12.29
Web 개발의 특징 / Django F/W를 사용해보며 느낀 점  (5) 2017.12.29
[python] logging example  (0) 2017.12.16
[python] unittest library - simple example  (0) 2017.12.15
[python] numpy 함수들  (0) 2017.12.14

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

<code example>

1
2
3
4
5
6
7
import logging
 
logging.basicConfig()
log = logging.getLogger('hj')
log.setLevel(logging.DEBUG)
 
log.debug('msg')
cs


<logging level>

LevelNumeric value
CRITICAL50
ERROR40
WARNING30
INFO20
DEBUG10
NOTSET0

<API 설명>

logging.basicConfig()

# stderr StreamHandler와 Formatter를 설정함으로써, console에서 log를 확인할 수 있게 해준다


logging.getLogger(logger_name)

# get logger instance


log.debug(msg)

# log debug message


<필요성/편리성>

print()를 통해서 logging을 할 경우와 비교

logging module을 사용하면,

 - log를 켜고 끌수 있다

 - 한줄로 여러 개의 stream에 log를 쓸수있다


<참조>

https://docs.python.org/3/library/logging.html


WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

1
2
3
4
5
6
7
8
import unittest
 
class MyTest(unittest.TestCase):
    def test_func(self):
        self.assertEqual(4+6 // 25# fail
 
if __name__ == '__main__':
    unittest.main()
cs


<unittest의 필요성>

프로그램 규모가 커질수록, 전체 프로그램 단위로 테스트하면 테스트 시간도 오래 걸리고

에러가 발생했을 때 디버깅도 점점더 어려워진다

이 때, unittest는 unit 단위로 테스트함으로써 테스트 시간과 디버깅을 쉽게 만들어준다

그러므로 규모가 작은 프로젝트에서는 필요성을 못느끼지만, 규모가 커질수록 필요성이 느껴질 것이다

(디자인 패턴과 같은 맥락이다)


<사용법>

1. unittest.TestCase를 상속받는 클래스

2. 테스트할 메서드 이름은 'test'로 시작

3. unittest.main() 콜



'Language > python' 카테고리의 다른 글

[python] 추상클래스(abstract class) - abc module  (0) 2017.12.16
[python] logging example  (0) 2017.12.16
[python] numpy 함수들  (0) 2017.12.14
[python] skimage ndarray shape (HWC, CHW)  (0) 2017.12.14
[python] ctypes API example  (0) 2017.12.13

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

import numpy as np


# array(...)

arr = np.array([1,2,3]) # 1 dimension array

arr = np.array([[1,2,3],[4,5,6]], np.int32) # 2 dimension array as type int32


# zeros((w, h, ...)) # empty array

arr2 = np.zeros((2,3), np.float32) # == [[0,0,0],[0,0,0]] as type float32


# arange(n)

arr3 = np.arange(10) # == [0,1,2,...9]


# reshape(w, h, ...)

arr3 = arr3.reshape(2,5) # == [[0,1,2,3,4],[5,6,7,8,9]]


---


# swapaxes()

arr.shape # (2, 3)

arr = arr.swapaxes(0, 1) # axe 0와 axe 1을 swap함

arr.shape # (3, 2) # shape을 통해 바뀐 axe 쉽게 확인가능


'Language > python' 카테고리의 다른 글

[python] logging example  (0) 2017.12.16
[python] unittest library - simple example  (0) 2017.12.15
[python] skimage ndarray shape (HWC, CHW)  (0) 2017.12.14
[python] ctypes API example  (0) 2017.12.13
[python] ctypes.memmove() example  (0) 2017.12.13

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

<HWC?>

caffe2에서 image pre-processing을 하는데, HWC, CHW가 나와서 의미를 찾아보게 되었다

H=height

W=width

C=channels


<Channels?>

특히 channels의 경우, gray-image이면 1, RGB이면 3, RGBA이면 4이다

ex) (360, 480, 3)

height=360

width=480

channels=3


'Language > python' 카테고리의 다른 글

[python] unittest library - simple example  (0) 2017.12.15
[python] numpy 함수들  (0) 2017.12.14
[python] ctypes API example  (0) 2017.12.13
[python] ctypes.memmove() example  (0) 2017.12.13
[python] REST API request using python  (0) 2017.12.09

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

-- ctypes --


from ctypes import *


# pointer

pStr = c_char_p(b'hello')

pSth = POINTER(somthing_type)

# get data of pointer

pSth.contents # *p


# array

arr = (c_char * 100)()

2dArr = (c_char * 10 * 100)() # char arr[100][10], 곱 순서 반대 주의

# get data of array

python array와 사용법 동일


# get address of data

addressof(arr)


# get size of data

sizeof(arr)


# memmove()

http://ssaemo.tistory.com/94


# c function (result type, args...)

@CFUNCTYPE(c_int, c_int)

def callback(num):

    return num


--- numpy ---


numpy는 ctypes와 compatibility를 제공하고 있다 (그 외 struct)

numpy도 함께 사용하면 편리할 때가 있으니, 추가로 알아보자


# numpy empy array

numpy.zeros((row_cnt, col_cnt))


'Language > python' 카테고리의 다른 글

[python] numpy 함수들  (0) 2017.12.14
[python] skimage ndarray shape (HWC, CHW)  (0) 2017.12.14
[python] ctypes.memmove() example  (0) 2017.12.13
[python] REST API request using python  (0) 2017.12.09
[python] random list with no duplicates  (0) 2017.12.08

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# memmove(dst, src, size) == memcpy(dst, src, size)
# usage of pointer equals to array
 
src = (c_char*100)(1,2,3,4# array declare
 
# array
pStr = c_char_p(b'kkkk'# pointer to b'hello' declare
print(pStr.value) # output: b'kkkk'
memmove(pStr, src, sizeof(pStr))
print(pStr.value) # output: 1,2,3,4
 
dst = (c_char*100)(5,5# array declare
print(dst.value) # output: 5,5
memmove(dst, src, sizeof(dst))
print(dst.value) # output: 1,2,3,4
 
cs


memmove의 첫번째, 두번째 파라미터는 data의 address(int)로도 사용가능하다

memmove(ctype, ctype, int)

memmove(int, int, int)


이것은 numpy와 ctypes를 함께 사용할 때 유용하다

ndarr.ctypes.data를 통해 array의 address를 얻을 수 있고, 이것으로 memmove를 사용할수 있기 때문이다

'Language > python' 카테고리의 다른 글

[python] skimage ndarray shape (HWC, CHW)  (0) 2017.12.14
[python] ctypes API example  (0) 2017.12.13
[python] REST API request using python  (0) 2017.12.09
[python] random list with no duplicates  (0) 2017.12.08
[python] selenium install  (0) 2017.11.30

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

https://stackoverflow.com/questions/17301938/making-a-request-to-a-restful-api-using-python


import requests
url = 'http://ES_search_demo.com/document/record/_search?pretty=true'
data = '''{
  "query": {
    "bool": {
      "must": [
        {
          "text": {
            "record.document": "SOME_JOURNAL"
          }
        },
        {
          "text": {
            "record.articleTitle": "farmers"
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  },
  "from": 0,
  "size": 50,
  "sort": [],
  "facets": {}
}'''
response = requests.post(url, data=data)



'Language > python' 카테고리의 다른 글

[python] ctypes API example  (0) 2017.12.13
[python] ctypes.memmove() example  (0) 2017.12.13
[python] random list with no duplicates  (0) 2017.12.08
[python] selenium install  (0) 2017.11.30
[python] list in for-loop syntax (+tuple)  (0) 2017.11.29

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

중복없는 랜덤 리스트 생성하기 (파이썬)

1
2
3
4
5
6
7
8
9
def random_list(n):
    temp = list(range(n))
    result = []
    while len(temp) > 0:
        idx = int(random() * len(temp))
        result.append(temp[idx])
        del temp[idx]
    return result
 
cs




WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

selenium은 automated browser(자동화 브라우저) 라이브러리로서, 웹 애플리케이션 테스팅이나 기타 등등의 용도로 사용할 수 있다

selenium의 python binding을 설치해보자


아래 명령어로 selenium을 설치한다

pip install selenium

아래 사이트에서 자신의 OS에 맞춰 chromedriver를 다운받는다

https://sites.google.com/a/chromium.org/chromedriver/getting-started

그리고 아래 샘플 코드를 실행해보자

import time
from selenium import webdriver

driver = webdriver.Chrome('/path/to/chromedriver')  # Optional argument, if not specified will search path.
driver.get('http://www.google.com/xhtml');
time.sleep(5) # Let the user actually see something!
search_box = driver.find_element_by_name('q')
search_box.send_keys('ChromeDriver')
search_box.submit()
time.sleep(5) # Let the user actually see something!
driver.quit()

webdriver.Chrome()의 파라미터만 수정 해주면 된다

코드를 실행하면 크롬 브라우저가 실행되는 것을 확인할 수 있다


참고:

http://selenium-python.readthedocs.io/installation.html

https://sites.google.com/a/chromium.org/chromedriver/getting-started




WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

리스트 내포(List comprehension)

# '1 2 3 4'를 입력받아 [1,2,3,4] 리스트 생성

[int(i) for i in input().split()] # == list(int(i) for i in input().split())

# tuple version

tuple(int(i) for i in input().split())


참고: 

https://wikidocs.net/22

https://stackoverflow.com/questions/16940293/why-is-there-no-tuple-comprehension-in-python



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

pip install ipython 시 겪은 에러로, 원인은 pip version이었다


ipython github README 인용

You will need to update pip to the version 9.0.1 or greater


아래 명령어로 pip를 upgrade하고 version을 확인해보자

pip install -U pip

pip --version



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

ctypes에서 python 함수를 callback 함수로 사용하기 위해서는 CFUNCTYPE을 사용해야한다

ctypes documentation에 나온 사용방법은 아래와 같다


1
2
3
4
5
6
from ctypes import *
 
def py_callback(mystr):
    pass
 
callback = CFUNCTYPE(c_int, POINTER(c_char))(py_callback)
cs


C 함수에 function pointer를 전달할 때 py_callback을 전달할 수는 없으므로

CFUNCTYPE을 이용해서 callback을 만들어 전달하면 된다

이때 CFUNCTYPE을 python decorator로 사용하여 더 간단하게 만들 수 있다


1
2
3
4
5
from ctypes import *
 
@CFUNCTYPE(c_int, POINTER(c_char))
def callback(mystr):
    pass
cs


---


cfunc는 arg, restype를 아래와 같이 설정할 수 있다

이 작업은 optional하지만, 디버깅을 쉽게만들어주는 효과를 줄것이다


callback.argtypes = [ ... ] # default: None

callback.restype = ... # default: c_long




WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

<converting bytes to ctypes.c_short array가 필요한 경우>

NAVER CAMPUS HACK DAY에서 진행한 프로젝트 중에

pcm 파일을 read하여 c 함수에 short array 파라미터로 전달해야했다

그 때 이 converting 과정이 필요했다


<example>

struct 라이브러리에 있는 struct.unpack(fmt, buf)를 사용하면 된다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import struct
 
# CONSTANT
FILE_PATH = 'sample.pcm'
BUF_SIZE = 3200
SHORT_PER_BYTE = 16/8 # 2
 
def callback(buf): # buf is POINTER(c_short)
    # read to bin_data
    f.open(FILE_PATH, 'rb')
    bin_data = f.read(BUF_SIZE)
 
    # unpack to short_arr
    count = len(bin_data)/SHORT_PER_BYTE
    short_arr = struct.unpack('<'+('h'*count), bin_data)
 
    #copy to buf
    for i in range(count):
        buf[i] = short_arr[i]
 
cs


struct.unpack('<hh', bin_data)

length=4의 bin_data 변수를 unpack하여 length=2의 tuple을 return한다

unpack format에 대해서 설명하자면,

'<'는 byte order 중 little-endian을 의미 (반대는 '>')

'h'는 short 1개를 의미, 즉 'hh'는 short 2개를 의미

즉 h 갯수를 len(bin_data)에 맞춰주면 된다


필자가 사용한 pcm 파일이 pcm_s16le 타입이었기 때문에 (ffmpeg audio Types 참고)

위와 같은 format을 사용했다


---


여담으로, 'h'와 'H'의 차이는 signed/unsigned인데

memory-level에서 보면 동일하지만 그것을 어떻게 decode하느냐가 다르다.

예를들어 'h' 또는 'H'에 따라 b'\xff\xff'는 -1 또는 65535로 decode된다



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

import requests

from bs4 import BeautifulSoup


html = requests.get(url).content

soup = BeautifulSoup(html, 'html.parser')

soup.find_all('mytag') # output: list

soup.find_all(id='myid')

soup.find_all('mytag', { 'class' : 'myclass' })


soup.find('mytag') # output: only one

soup.mytag

'Language > python' 카테고리의 다른 글

[python] ctypes.CFUNCTYPE 사용법  (0) 2017.11.27
[python] converting bytes to ctypes.c_short array  (0) 2017.11.26
[python] get html (urlopen) best way  (0) 2017.11.26
[python] str to bytes  (0) 2017.11.25
[python] json example  (0) 2017.11.25

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

url로부터 html을 가져오기 위한 라이브러리로 urllib, 2, 3 등이 있지만

필자는 requests를 이용할 것이다

request는 urllib3를 기반으로 한 라이브러리로, 가장 짧고쉽게 html을 얻을 수 있다

pip install requests

설치 후, 아래와 같이 사용할 수 있다

import requests


url = 'https://www.naver.com/'

html = requests.get(url).content

얻은 html은 BeautifulSoup 등에서 이용할 수 있다

from bs4 import BeautifulSoup


soup = BeautifulSoup(html, 'html.parser')


'Language > python' 카테고리의 다른 글

[python] converting bytes to ctypes.c_short array  (0) 2017.11.26
[python] beautifulsoup4 example  (0) 2017.11.26
[python] str to bytes  (0) 2017.11.25
[python] json example  (0) 2017.11.25
[python] Windows python3, jupyter 설치하기  (0) 2017.11.25

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

# str vs bytes

'string' # type: str

b'string' # type: 


string = 'string'

string # output: 'string'

type(string) # output: str


# str to bytes (encode str obj to utf-8 bytes)

bstr = string.encode()

type(bstr) # output: bytes


# bytes to str (decode utf-8 bytes to str obj)

bstr.decode() # output: utf-8

bstr.decode('utf-16') # output: utf-16



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

참조: http://docs.python-guide.org/en/latest/scenarios/json/


1
2
3
4
5
6
7
8
9
10
11
12
13
14
import json
 
# json string to dict obj
json_string = '{"first_name": "Guido", "last_name":"Rossum"}'
parsed_json = json.loads(json_string)
print(parsed_json['first_name'])
 
# dict obj to json string
= {
    'first_name''Guido',
    'second_name''Rossum',
    'titles': ['BDFL''Developer'],
}
print(json.dumps(d))
cs




WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

사용중인 블로그 스킨이 방명록을 지원하지 않습니다.

초대장을 받고싶으신 분들은 댓글 또는 블로그 설명의 메일로.