python datetime

app/python 2019.06.04 23:57

from datetime import datetime, timedelta
import pytz

# 현재 시간
now = datetime.now()
print(now)

# 시간 지정 생성
set_datetime = datetime.strptime('2019-12-31 00:00:00', '%Y-%m-%d %H:%M:%S')
print(set_datetime)

# 시간 더하기 뺴기
before = now - timedelta(hours=7)
after = now + timedelta(hours=7)
print(before, after)

# UTC time
dt = datetime.utcnow()
print(dt)

# iso8601
# Timezone을 설정
local_timezone = pytz.timezone('Asia/Seoul')
local_date = now.replace(tzinfo=pytz.utc).astimezone(local_timezone)
print(local_date)

# iso8601 밀리세컨드 제거
local_date = now.replace(tzinfo=pytz.utc).astimezone(local_timezone).replace(microsecond=0)
print(local_date)

# timezone
tz = local_date.tzinfo
print(tz)

# datetime to str
nowDatetime = now.strftime('%Y-%m-%d %H:%M:%S')
print(nowDatetime, type(nowDatetime))

# datetime to timestamp
timestamp = now.strftime('%s')
print(timestamp)

# timestamp to datetime
now_datetime = datetime.utcfromtimestamp(int(timestamp)).strftime('%Y-%m-%d %H:%M:%S')
print(now_datetime)


WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret


python 프로젝트를 할때마다 환경 설정이 다르기 때문에 (python 버전이나 설치 패키지들.) virtualenv 모듈을 통해 가상환경을 만들어 줘야 합니다. 

해당 포스팅은  pycharm에서의 virtualenv 셋팅에 대한 글입니다. 

(mac 환경에서 진행하였으며, python3.7 / pip3 를 기본으로 하였습니다.)


먼저 하단의 terminal를 실행 시켜 보면 로컬에 설치 되어 있던 모든 모듈/패키지가 작동하지 않습니다. 


$ echo $PATH

일반 터미널에서 해당 명령어를 실행하면 아래와 같이 설정이 잡힌것을 볼 수 있습니다. 


다시 pycharm의  터미널에서 실행하면 아래 환경설정만 나오는것을 볼수 있습니다. (/url/local/bin 이 빠진것을 확인할 수 있습니다.)

pycharm의 새 프로젝트 시작시 다른 PATH가 설정되어 명령어가 동작하지 않습니다. 먼저 PATH 를 잡아줍니다.


$ export PATH=$HOME/bin:/usr/local/bin:$PATH

위의 명령어를 pycharm의 터미널에서 실행 후 다시  echo $PATH로 확인해보면 local/bin 이 추가 되었음을 확인 할 수 있습니다.


이제 기존에 로컬에 설치 하였던 모듈과 패키지들을 불러올수 있습니다. pip3 가 작동하는지 확인합니다. 

(혹시 pip3가 설치가 되있지 않다면 $ sudo apt-get install python3-pip 를 실행하여 설치하시면 됩니다. )

$ pip3 -v

pip3의 버전이 확인 되었습니다. 이제 virtualenv를 통해 가상환경을 만들어 줍니다. 

pycharm의 터미널에서 아래의 명령어를 실행 합니다. 

$ python3 -m virtualenv venv

(혹시 virtualenv가 설치 되지 않았다면 $ pip3 install --upgrade virtualenv 를 실행하여 설치 합니다.)


완료가 되었다면 해당 프로젝트 내에 venv라는 폴더 생성과 함께 가상환경의 기본 모듈들이 들어가 있음을 확을 확인 할수 있습니다. 

이제 해당 가상 환경을 적용하기 위해 아래의 명령어를 실행합니다. 

$ source venv/bin/activate


터미널의 명령줄 앞에 (venv)라고 표기가 되면 정상적으로 적용이 된 것입니다. 

하지만!!!!  pycharm을 끝내면 해당 activate한 환경이 다시 풀려 있음을 확인할수 있습니다.

pycharm의 환경설정에서 해당 가상환경으로 셋팅을 추가해줘야 합니다. 

메뉴바 -> Pycharm -> Preferences -> Project -> Project Interpreter 로 이동합니다. 

해당 화면에서 오른쪽 상단의 설정 버튼을 눌러주면 add / show all 선택 화면이 나옵니다. show all 버튼을 눌러줍니다.


아래 화면과 같이 기존의 로컬 환경 설정이 나옵니다. (저의 경우 기존 추가한 환경 설정이 보입니다.)

아래의 + 버튼을 눌러줍니다. 


Add Python Interpreter 화면이 나옵니다. 

첫번째 virtualenv Environment 탭에서 Existing environment 를 선택해 줍니다. 

Interpreter는 현재 폴더에 추가한 venv폴더를 선택해 줍니다.(자동 선택 되어 있을겁니다.)

OK를 눌러줍니다. 


방급 추가한 가상환경을 선택하고  OK를 눌러줍니다. 


이제 Project Interpreter는 가상환경이 적용되어 설치된 모듈이 3가지 밖에 없는 깨끗한? 환경을 볼수 있습니다. 


터미널을 다시 켜면 앞에 (venv)가 적용되어 가상환경이 적용된것을 확인할수 있습니다. 



참고

https://intellij-support.jetbrains.com/hc/en-us/community/posts/208567485-Pycharm-terminal-is-missing-part-of-PATH


WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

pytest 설치

테스트 코드를 작성하고 실행할 수 있도록 pytest를 설치한다.

pip install -U pytest

간단히 hello_test.py를 만들어 보자.

def test_hello():
    assert hello('JOKER') == 'Hello, JOKER!'

pytest를 실행하면 해당 프로젝트의 *_test.py 파일 안에 있는 모든 test_* 테스트 함수를 확인하게 된다.

pytest

간단히 통과시키자.

def hello(name):
    return 'Hello, {}!'.format(name)


def test_hello():
    assert hello('JOKER') == 'Hello, JOKER!'

파일이 수정될 때마다 자동으로 실행하게 하려면 pytest-watch를 쓰면 된다.

pip install -U pytest-watch

실행할 때는 오히려 더 짧게 쓰면 된다.

ptw

pylama 설치

올바르게 코딩하는 걸 도울 수 있도록 정적 분석기를 사용하자. 여기서는 Pylava를 이용해 검사한다.

pip install -U pylava

간단히 돌려보자.

pylava

venv 폴더가 있다면 그것도 포함해서 검사하기 때문에 지나치게 오래 걸린다. --skip 플래그로 해당 폴더를 제외하자.

pylava --skip "venv/*"

Pylint도 함께 사용해 보자. Pylava의 기본 Linter 목록은 여기에서 확인할 수 있다.

# Pylint 설치
pip install -U pylava-pylint

# Linter 목록 바꿔서 실행
pylava --skip "venv/*" --linters "pycodestyle,pyflakes,mccabe,pylint"

매번 linters 플래그를 적어주는 게 불편하다면 pylava.ini 또는 pytest.ini 파일을 만들어서 다음 내용을 넣어준다.

[pylava]
skip = venv/*
linters = pycodestyle,pyflakes,mccabe,pylint

docstring이 빠졌고 빈 줄이 부족하다고 하니 모두 추가하자.

"""Sample test code."""


def hello(name):
    """Return greeting message."""
    return 'Hello, {}!'.format(name)


def test_hello():
    """hello function test."""
    assert hello('JOKER') == 'Hello, JOKER!'

pytest와 pylava를 통합해 보자.

pytest --pylava

매번 --pylava 플래그를 입력하는 게 불편하면 pytest.ini 파일에 다음을 추가한다.

[pytest]
addopts = --pylava

이제 python-watch 하나만 실행하면 코드가 올바른지 계속 감시할 수 있다.

ptw





WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

c to machin language

app/C 2018.12.07 15:40

'app > C' 카테고리의 다른 글

c to machin language  (0) 2018.12.07
최상위 윈도우 이름 구하기  (0) 2012.12.23
winapi 환경에서 콘솔 띄우기  (2) 2012.12.17
iphone 시간 출력 하기!  (0) 2010.06.28
head first iphone 2장...-_- 슬슬 입질이 온다.  (0) 2010.06.25
head first iphone 1장~  (0) 2010.06.24

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

ubuntu에서 pycharm에서 라이블러리를 추가 할때 ImportError: No module named pip 에러가 난다면 


(pip를 설치 했어도 계속 난다면!!)


python에 대한 권한을 설정해 주시면 됩니다.



sudo chmod -R a+rX /usr/local/lib/python2.7/dist-packages/
sudo chmod -R a+rX /usr/local/lib/python3.4/dist-packages/


python2.7 / 3.4 버전의 권한을 추가해 주시면 정상 작동 합니다.


WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

음.. SQLAlchemy를 해보고 있는데 정말 수 많은 도큐먼트와 Q&A를 뒤져가며 설치 했지만 계속


 ImportError: No module named 'MySQLdb'


가 반복한다면  pymysql도 설치한다음

('mysql://'...)

이 부분을

('mysql+pymysql://'..)

이렇게 바꿔보세요.
거짓말처럼 됩니다...-_-...



WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret


에러다!! 또 에러..

msyql-python을 설치하려 했더니 에러가 똬악!!


간단한 해결

1.update

$sudo apt-get update


2. python-dev install

$sudo apt-get install python-dev


3. install 

$sudo pip install mysql-python


WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret



python의 timeit으로 콘솔에서는 쉽게 함수 수행시간을 알수 있지만 콘솔이 아닌 ide 환경이나 파일로 timeit 을 import로 해야 합니다 .


수행하려는 함수가 다음과 같습니다. 


sorting.py 


def insertion():
list = [33, 11, 99, 1, 22, 88, 55, 44, 66, 77]
for i in range(len(list)):
if i+1 < len(list):
pin = i+1
for j in reversed(range(0, pin)):
if list[j] > list[pin]:
list[pin], list[j] = list[j], list[pin]
pin = j
else:
break
return list


다른 파일에서 다음과 같습니다. 

import timeit
print(timeit.timeit("insertion()",
setup="from sorting import insertion", number=100))


timeit() 함수 안에 


첫번째 인자는 해당 함수이름 

두번째 인자는 setup으로 해당 py파일을 지정

세번째 인자는 number로 디폴트로 10000입니다.  (number는 해당 숫자만큼 실행한후 평균값 리턴합니다. 위에선 100번 수행후 리턴)



이제 테스트 시간 측정은 timeit 으로 하시면 됩니다. 




자세한 사항은  : https://docs.python.org/2/library/timeit.html

참 쉽죠?!







WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret


그 유명한 travis ci 를 이제서야 써봤습니다. (요즘 CI에 관심이 많습니다.)


뭐 대부분이 젠킨스를 쓰고 계시겟지만 젠킨스의 단점은 서버가 필요하고 설치를 해야 하는것이죠. (물론 설치가 쉽습니다.)


travis ci 는 github 와 연동하여 자동으로 테스트 할수 있는 서비스 입니다. (더 복잡한 처리도 가능합니다.)


travis는 상당히 많은 언어를 지원해 줍니다.  현재 공식으로 지원해주는 언어만


네. 그냥 다 된다고 보시면 됩니다.


해당 언어마다 테스트 하는 라이블러리는 당연히 다른데요.  지원하는 테스트 라이블러리는 아래와 같습니다. 


  • nose
  • py.test
  • mock
  • wheel



그러면 github 와 travis 연동입니다. 


1. 먼저 https://travis-ci.org/  에서 signup을 눌러 줍니다.



2.  github auth와 연동됩니다. 권한등에 대해서 설명해줍니다. authorize application 버튼을 눌러줍니다.




3. 해당 github에서 레파지토리 리스트를 가져옵니다. 원하는 프로젝트를 클릭하여 switch on 시켜 주면 해당 프로젝트와 연동 끝! (쉽죠?)



4. travis ci 예전 버전에서는 해당 프로젝트마다 settings에 들어가서  webhooks 를 설정해 줘야 되었지만 이젠 자동으로 연계됩니다. 

(젠킨스는 연동하려면 서버 키를 등록시켜 줘야 하지만 github에서 travis 를 잘 연계시켜 줍니다. )



5. 이제 프로젝트에서 travis를 연동시킬 파일이 필요합니다. 

프로젝트에 새파일로 .travis.yml 이름으로 파일을 만듭니다.

그리고 아래와 같이 넣어줍니다. 


language: python
python:
- "3.5"

install:
- pip install pymysql

# command to run tests
script:
- py.test

저의 경우 파이썬 3.5버전.

mysql을 사용해서 pymysql모듈을 설치

테스트는 pytest 를  사용으로 명시한것입니다. 


혹시 프로젝트에 따로 설치 해야 하는 모듈이 있다면 

https://docs.travis-ci.com/user/ci-environment/

여기를 참고하세요.



6. 5번과 같이 한 다음 해당 프로젝트를 github에 푸시 하면 자동으로 웹훅이 발동하여 travis에서 빌드를 시작합니다!!! 오!!!!


7. 이제부턴 필요한 테스트 모듈을 넣어줘서 자동으로 테스트 하게끔 만들어 주면 됩니다. 참 쉽죠?!



- 흠...역시 서버가 도커로 되어 있군요. 빌드 할때마다 도커 인스턴스가 생성되는것을 볼수 있습니다. (오픈 소스이니 자체 서버에 설치해서 도커로 연습할수 도 있겠군요. ㅎ)


Using worker: worker-linux-docker-64e8129c.prod.travis-ci.org:travis-linux-2


- travis 의 자세한 api는 아래를 참조하세요!

https://docs.travis-ci.com/user/trusty-ci-environment/






WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret


해당 문장이 긍정인지 부정인지 판단하는 프로그램~ (실은 홈페이지로 만들려고 했으나..... 한글 형태소 분석에 자원을 너무 많이 써서 서버가 멈추는... 돈이 없어서 가장 성능 낮은 서버를 쓰고 있으니..프로그램 하나 안돌아간......ㅜㅡㅜ)



먼저 조건부 확률은 (https://ko.wikipedia.org/wiki/%EC%A1%B0%EA%B1%B4%EB%B6%80_%ED%99%95%EB%A5%A0 )

확률 공간 Ω에서의 두 사건 A, B에 대해서 P(B) > 0일 때 사건 B가 일어났을 때 사건 A의 조건부 확률은





긍정 부정 두가지 상황이 있으므로 


P(c) = 1/2 

 

P1(x|c) = count(해당 문장에서 긍정 단어 리스트 수 ) / count(전체 긍정 단어 리스트 수 )


P2(x|c) = count(해당 문장에서 부정 단어 리스트 수 ) / count(전체 부정 단어 리스트 수 )



if p1 > p2: 
  
   긍정

else:
 
  부정

이 된다.



자세한 사항은 http://newpower.tistory.com/127 참조



from konlpy.tag import Kkma
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', passwd='123qwe', db='word', charset='utf8')
cur = conn.cursor()
kkma = Kkma()


#조건부 확률 계산
def conditional_probability(test, train_table, all_count, table_count):
    counter = 0
    list_count = []

    #해당 문장이 해당 테이블에 존재 하는지 확인
    for word in test:
        cur.execute("SELECT count(*) as cnt  FROM "+train_table+" where word = '"+word+"'")
        for cnt in cur:
            if int(cnt[0]) > 0:
                counter += 1

        list_count.append(counter)
        counter = 0

    print(list_count)

    cal_list = []
    for j in range(len(list_count)):
        #다음에 * 연산할떄 0이 되지 않기 위해 +1을 해줌
        cal_list.append((list_count[j]+1)/float(table_count+all_count))
    result = 1
    for j in range(len(cal_list)):
        result *= float(round(cal_list[j], 6))

    return_value = float(result)*float(1.0/2.0)
    print(return_value)
    return return_value

# get the data
input_file = open('input.txt', 'r')

list_positive = []
list_negative = []

#형태소 분리
input_line = input_file.readline()
input_kkma = kkma.pos(input_line)

print(input_kkma)

test_output = []
for i in input_kkma:
    test_output.append(i[0])

#긍정 단어 전체 갯수
cur.execute("SELECT count(*) as cnt  FROM positive ")
positive_count = 0
for response in cur:
    positive_count = int(response[0])

#부정 단어 전체 갯수
cur.execute("SELECT count(*) as cnt  FROM negative ")
negative_count = 0
for response in cur:
    negative_count = int(response[0])

# naive bayes 값 계산
result_pos = conditional_probability(test_output, 'positive', positive_count+negative_count, positive_count)
result_neg = conditional_probability(test_output, 'negative', positive_count+negative_count, negative_count)

if result_pos > result_neg:
    print(u'긍정')
else:
    print(u'부정')




결과


" 너는 아름답다."  는 다음과 같이 나옵니다.




끝.


WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  1개가 달렸습니다.
  1. 긍정부정으로 나뉜 텍스트는 직접 만드신건가요??
secret