python3로 마이그레이션 하던 중에 다음과 같은 에러를 만났다.


 {%- for hostname, stat in stat.iteritems() %}

jinja2.exceptions.UndefinedError: 'dict object' has no attribute 'iteritems'





python3의 dict 클래스의 iteritems는 items로 변경되었다.







Posted by 김용환 '김용환'



virtualenv에서 그냥 가상 환경을 실행하면 python2 환경으로 구축된다.



$ virtualenv envname




python3 환경으로 구축하고 싶다면 다음 커맨드를 실행한다.



$ virtualenv -p python3 envname



Posted by 김용환 '김용환'


python 컴파일시 아래와 같은 python 에러가 발생할 수 있다. 




gevent/gevent.corecext.c:5:20: fatal error: Python.h: No such file or directory
#include "Python.h"
^
compilation terminated.
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1




python 개발 라이브러리가 없어서 에러가 발생한 것이다.




python 2.x라면 다음과 같이 실행한다.


$ sudo apt-get install python-dev



python 3.x라면 다음과 같이 실행한다.


$ sudo apt-get install python3-dev



Posted by 김용환 '김용환'

[python3] ++ 연산자

python 2017.09.28 20:03

python3에는 ++ 연산자가 없다.


+= 연산자만 있을 뿐이다.


예제



            if not self.conn.connected:

                retry_count += 1

Posted by 김용환 '김용환'





            

            

python2에서 string 타입에 대해서 decode('utf-8')를 잘 실행할 수 있지만, 

python3에서는 기본이 utf-8이기 때문에 굳이 decode를 사용할 필요가 없다. 따라서 decode 함수도 없다. 



>>> result = ""

>>> str(type(result))

"<class 'str'>"

>>> result.decode('utf-8')

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'str' object has no attribute 'decode'

>>>


https://docs.python.org/3/howto/unicode.html


The default encoding for Python source code is UTF-8, so you can simply include a Unicode character in a string literal:





또한 None도 생겼다.


python2에서는 kazoo를 통해서 얻은 값은 empty string이였는데.. python3에서는 None타입을 사용했다.

flask에서는 다음과 같이 사용했다.

{% if node.data == None %}
{% else %}
<span style="word-wrap: break-word">
{{node.data}}
</span>
{% endif %}




그리고 




파이썬2에서 딕셔너리의 iteritems()는 사라지고 items()로 대체되었다.





message = '\n'.join("%s: %s" % (key, val) for (key, val) in (sorted(rep.items())))







그 외


https://wiki.python.org/moin/Python3.0#Built-In_Changes를 참고한다.





파이썬2에서 3로 전환하면서.. 발생했는데..


flask에서는 아래와 같은 코드는 에러가 발생한다 (TypeError: 'NoneType' object is not subscriptable)

if request.json['head_commit'] is not None:


flask 0.10부터 json 프로퍼티는 None을 리턴한다. 2->3 버전 이슈는 아니고 라이브러리 이슈가 있다.


if request.get_json('head_commit') is not None:


Posted by 김용환 '김용환'


파이썬에서 타입, 값을 확인할 수 있는 예제이다. 



type()을 이용해 타입 확인할 수 있다. 


print("aaaaaaa : " + str(type(result)))


str()을 이용해 값을 확인할 수 있다.


print("aaaaaaa : " + str(result))



string 인스턴스라면..


if isinstance(result, str):


string 인스턴스가 아니라면.



if not isinstance(result, str):



None을 확인하는 코드이다.


a = None

if not a:

    print("1")

else:

    print("2")



결과는 다음과 같다.


1



None을 체크하는 코드이다. 


a = "1"

if not a:

    print("1")

else:

    print("2")



결과는 다음과 같다.

2



'python' 카테고리의 다른 글

[python3] ++ 연산자  (0) 2017.09.28
python2와 python3의 차이점 - string.decode()  (0) 2017.09.28
[python3] 파이썬 값/타입 확인 예제  (0) 2017.09.28
flask 환경 구성하기  (0) 2017.09.19
pyenv 설치 방법  (0) 2017.09.19
[python3] sorted 함수 예제  (0) 2017.07.20
Posted by 김용환 '김용환'



flask 설정하기 


$ virtualenv flaskapp

Using base prefix '/Users/samuel.kim/.pyenv/versions/3.6.0'

New python executable in /Users/samuel.kim/dev/my/test-flask/flaskapp/bin/python3

Also creating executable in /Users/samuel.kim/dev/my/test-flask/flaskapp/bin/python

Installing setuptools, pip, wheel...done.




활설화하려면 다음 커맨드를 사용한다.


$ . bin/activate

(flaskapp)



이제 flaskapp virtualenv가 추가되었다. 


shell에 변경되어 있다. 

(flaskapp) [~] 

(flaskapp) [~] 



Flask를 설치한다. 


$ pip install Flask




main.py을 다음처럼 수정한다. 


from flask import Flask


app = Flask(__name__)



@app.route('/')

def hello_world():

    return 'Hello World!'



if __name__ == '__main__':

    app.run()




그리고 쉘에서 다음처럼 실행하고 localhost:5000에 접속한다.


$ export FLASK_APP=main.py

$ flask run

 * Serving Flask app "main"

 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

127.0.0.1 - - [19/Sep/2017 20:50:50] "GET / HTTP/1.1" 200 -





Posted by 김용환 '김용환'

pyenv 설치 방법

python 2017.09.19 16:10



pyenv 설치 방법이다. 




$ python --version

Python 2.7.12


$ pyenv install 3.6.0


$ pyenv versions

  system

  2.7.12

* 3.6.0 (set by /Users/samuel.kim/.pyenv/version)






virtualenv를 설치한다.


$ python3 -m pip install virtualenv virtualenvwrapper


$ virtualenv

You must provide a DEST_DIR

Usage: virtualenv [OPTIONS] DEST_DIR



$ pip -V

pip 9.0.1 from /Users/samuel.kim/.pyenv/versions/3.6.0/lib/python3.6/site-packages (python 3.6)

 


$ pip install virtualenv virtualenvwrapper



$ brew install pyenv-virtualenv




~/.bash_profile에 다음을 추가한다. (설정)



export PATH="$HOME/.pyenv/bin:$PATH"

export PYENV_VERSION=3.6.0

eval "$(pyenv init -)"

eval "$(pyenv virtualenv-init -)"




~/.bash_profile을 읽는다. 


$ source ~/.bash_profile



.pyenv 밑에 python이 위치한다면 성공한 것이다.



$ which python

/Users/samuel.kim/.pyenv/shims/python

  

  


이제 정상적으로 동작하는 지 확인한다. pyenv에서 파이썬을 설치하려면 install 커맨드를 실행하며 다음과 같다. 



bash_profile에서 설정된 대로 동작되었다. 


$ python --version

Python 3.6.0(set by PYENV_VERSION environment variable)


$ pyenv install 3.6.1


$ pyenv shell 3.6.1

 

$ pyenv versions

  system

* 3.6.0 

* 3.6.1 (set by PYENV_VERSION environment variable)

  





pyenv의 특정 버전을 삭제하려면 uninstall을 사용하며 다음과 같다.


$ pyenv uninstall 3.6.0

  



pyven 버전 이동은 shell을 사용한다.


$ pyenv shell 2.7.12

$ pyenv version

2.7.12




'python' 카테고리의 다른 글

[python3] 파이썬 값/타입 확인 예제  (0) 2017.09.28
flask 환경 구성하기  (0) 2017.09.19
pyenv 설치 방법  (0) 2017.09.19
[python3] sorted 함수 예제  (0) 2017.07.20
[python3] python3에서 자주 실수하는 부분  (0) 2017.07.18
[python3] dict()의 in의 의미  (0) 2017.07.11
Posted by 김용환 '김용환'



파이썬의 sorted 함수는 콜렉션(List, Tuple, 등) 및 배열을 정렬할 수 있다. 


정렬 키를 lambda를 사용해서 깔끔히 정렬되는 것을 보니 깔끔해 보인다. 



print("List")
lst = ['cc', 'aa', 'ba', 'md']
print(list)
print("origin-", lst)
print("sort-", sorted(lst))
print("sort(reverse)-", sorted(lst, reverse=True))
print("\n")

print("\n")
print("Tuple")
tup = [('cc', 3), ('aa', 2), ('ba', 5), ('md', 4)]
print("origin-", tup)
print("sort-", sorted(tup, key=lambda tup: tup[1]))
print("sort(reverse)-",sorted(tup, key=lambda tup: tup[1], reverse=True))
print("\n")

print("\n")
print("Class")
class Member:
def __init__(self, id):
self.id = id
def __repr__(self):
return repr(self.id)

members = [Member(1), Member(10), Member(5), Member(4)]
print("origin-", members)
print("sort-", sorted(members, key=lambda member: member.id))
print("sort(reverse)-", sorted(members, key=lambda member: member.id, reverse=True))


예제 결과는 다음과 같다. 


List

<class 'list'>

origin- ['cc', 'aa', 'ba', 'md']

sort- ['aa', 'ba', 'cc', 'md']

sort with reverse- ['md', 'cc', 'ba', 'aa']





Tuple

origin- [('cc', 3), ('aa', 2), ('ba', 5), ('md', 4)]

sort- [('aa', 2), ('cc', 3), ('md', 4), ('ba', 5)]

sort with reverse- [('ba', 5), ('md', 4), ('cc', 3), ('aa', 2)]





Class

origin- [1, 10, 5, 4]

sort- [1, 4, 5, 10]

sort(reverse)- [10, 5, 4, 1]

Process finished with exit code 0

Empty test suite.




'python' 카테고리의 다른 글

flask 환경 구성하기  (0) 2017.09.19
pyenv 설치 방법  (0) 2017.09.19
[python3] sorted 함수 예제  (0) 2017.07.20
[python3] python3에서 자주 실수하는 부분  (0) 2017.07.18
[python3] dict()의 in의 의미  (0) 2017.07.11
[python3] 맥에서 spyder 설치/실행  (0) 2017.04.28
Posted by 김용환 '김용환'


python3 코드를 개발하다가 자주 실수하는 부분을 적어본다.


1. raw_input은 사라졌다.


raw_input  대신 input 함수로 바꿔 그대로 사용한다.




2. print "" 이 아닌 print("")이다.


print "log : ..."



3. sqlite



python2에서는 sqlite import하고 난 뒤 쿼리를 날리면 buffer()를 사용했었는데, python3에서는 ()만 사용한다.


cur.execute('SELECT count FROM Ages WHERE org = ? ', (org, ))

row = cur.fetchone()


()를 사용하지 않으면, 다음 에러가 발생한다.


sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 40 supplied.





두 개의 매개 변수를 쿼리에 전달할 때는 다음처럼 2개의 변수를 ()에 넣어서 전달한다. 


cur.execute('''INSERT INTO Ages (id, age) VALUES ( ?, ? )''', (i,a), )




4. urllib api의 모듈 이름


파이썬 2              => 파이썬 3

urllib.urlencode() =>  urllib.parse.urlencode()

urllib.urlopen() => urllib.request.urlopen()





5. urllib api의 바이너리 


python2의 urllib에서는 urlopen의 결과가 기본 문자열이었다면 python3의 urllib.request.urlopen의 결과는 bytes이다.


에러는 TypeError: a bytes-like object is required, not 'str'와 같다.


    uh = urllib.request.urlopen(url, context=scontext)

    data = uh.read().decode('utf-8')

    


로그로 찍어보면 아래와 같이 byte로 읽는 것을 확인할 수 있다. 

characters b'{\




    

    

    

Posted by 김용환 '김용환'