Notice
Recent Posts
Recent Comments
«   2024/11   »
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
Tags
more
Archives
Today
Total
관리 메뉴

웹프로그래밍

파이썬임베딩 작업일지3 비트프로젝트 본문

카테고리 없음

파이썬임베딩 작업일지3 비트프로젝트

공부모드 2016. 7. 13. 05:01

이슈1 : 파이썬 스크립트 파일명(.py)과 함수 이름과의 관계에서 두 이름이 서로 다르더라도 import에는 문제가 없다.


이슈2 : 스크립트 파일(x.py) 내의 함수선언부 이전에 특정 소스(i=0)가 존재 하더라도 import에는 문제가 없다. 하지만 x.py 파일에  import문이 들어있으면 x.py를 import할 때에는 에러가 난다. 그 위치가 함수 내부이건 외부이건 관계없이 에러가 발생한다.

이슈3 : .py 파일에서 import하는 부분을 삭제하고 c코드에서 import하였더니 에러 발생
대처1 : sys.path.append()함수로 twitter의 위치를 추가하였음
결과 : 어떠한 파일을 import할 수 없다는 에러가 발생... 소용 없음.
File "<string>", line 1, in <module>
  File "/root/work/Twitter/Python/twitter/twitter.py", line 24, in <module>
    import calendar
  File "/usr/local/lib/python2.6/calendar.py", line 10, in <module>
    import locale as _locale
  File "/usr/local/lib/python2.6/locale.py", line 202, in <module>
    import re, operator
ImportError: /usr/local/lib/python2.6/lib-dynload/operator.so: undefined symbol: _PyUnicodeUCS2_AsDefaultEncodedString

대처2 : twitter.py파일을 현재경로에 복사하고, 대처1번에서 추가했던 경로를 제거한 후 다시 컴파일하였음
결과 : 상동

대처3 : 구글검색을 통해 
http://www.velocityreviews.com/forums/t699499-got-undefined-symbol-_pyunicodeucs2_asdefaultencodedstring-onopensuse-11-1-a.html
에서 다음과 같은 힌트를 얻음
This is just a guess, but try configuring with:

../configure --enable-unicode=ucs4 --prefix=/home/user/python

On Linux, by default, a self-compiled Python uses UCS2
internally for its unicode support (with some support
for UTF16). Most Linux distributions, however, distribute
a Python that uses UCS4 (aka UTF32) instead, so it seems
possible that your setuptools egg is expecting to find a
UCS4 build.

Mark

이를 바탕으로 ./configure --enable-unicode=ucs4 이렇게 컴파일하여 인스톨했음.

결과 : 문제 해결.

이를 보드에서도 테스트해보자


이슈4 : 파이썬에서 넘겨주는 유니코드(한글)를 받아오는 문제


대처 :  유니코드를 utf-8로 형변환하면 된다고하여 다음과 같이 작성.
u = statuses[0].text
print u.decode('utf-8')

결과 : 이 코드가 이클립스에서는 돌아가는데 커맨드라인에서는 다음과 같은 에러메시지 출력
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

대처2 : 파이썬마을에서 누군가 이와 비슷한 삽질을 한 것을 발견. decode 가 아니라 encode로 해야됨.
encode : 유니코드를 스트링으로 바꾸는것??
결과 : 성공

이슈4 : 이제부터 할 일.. 
1) 레퍼런스 카운트 조정하기
2) 5초에 한 번씩 내용이 변경되었으면 다시뿌리기
4) state기능 추가하기
3) 타겟보드에서 한글출력문제 해결하기

이슈4 : 트위터api를 사용할 때 twitter.py파일이 실행파일과 같은 디렉터리에 있어야 한다??
python-twitter를 install하지 않았다면 맞는 말이지만 install이후에는 해당 파일이 파이썬 디렉터리에 복사되기 때문에 필요 없다.

이슈5 : mips용 컴파일 옵션
mipsel-linux-g++  main.cpp -I/usr/include/python2.6 -pthread -lm -ldl -lutil /opt/nfsroot/Python-2.6.5/_install/lib/libpython2.6.a


이슈6 : (7/3 18:00) 레퍼런스보드에서 twit모듈을 import할 때 segment fault발생. python shell에서는  import가능..
정적 라이브러리를 함께 빌드하여 실행파일 크기가 4메가이상이 되는것이 문제가 될 수 있을까?
대처1 : 파이썬을 동적라이브러리로 빌드하여 다시 돌려보기.
1) 파이썬 을 빌드할 때 configure 옵션에 --enable-shared 옵션을 추가하여 동적 라이브러리를 사용할 수 있도록 빌드한다.
2) 응용프로그램을 빌드할 때 다음과 같은 옵션으로 컴파일한다. 이 때 라이브러리 경로의 /opt/nfsroot/ 부분이 문제가 될 거 같아서 삭제하고 mips용으로 컴파일 된 Python-2.6.5디렉터리를 / 경로 아레에 복사해 두었다. 즉 /경로와 /opt/nfsroot/ 경로에 같은 Python-2.6.5디렉터리가 존재하게 된다.
$ mipsel-linux-g++  main.cpp -I/usr/include/python2.6 -pthread -lm -ldl -lutil /Python-2.6.5/_install/lib/libpython2.6.so
3) 보드에서 LD_LIBRARY_PATH를 설정한다.
결과 : 성공. 혹시 공유 라이브러리 때문이 아니라 경로에서 /opt/nfsroot/ 부분을 제거한 것 때문에 돌아가는 것일지도 모른다는 생각에 
/opt/nfsroot/를 추가하여 다음과 같이 컴파일 해 보았는데 이 또한 잘 돌아간다. 
mipsel-linux-g++  main.cpp -I/usr/include/python2.6 -pthread -lm -ldl -lutil /opt/nfsroot/Python-2.6.5/_install/lib/libpython2.6.so
문제는 역시 공유 라이브러리가 아닌 정적 라이브러리를 사용했기 때문이었던 듯.


이슈7 : (7/5 10:00)기존에 작 작동하던 코드가 에러를 발생시킴
밝혀진 원인 : 분석 결과 GetFriendsTimeline()함수에 전달인자로 count=1 을 주고 호출했을 때 가장 최근의 메시지가 retweet된 메시지라면 서버로부터 아무 내용을 받아오지 않게된다. 이는  return statuses[0].text.encode('utf-8') 코드에서 에러를 발생시킨다(해당 인덱스에 아무 값도 받아오지 않았기 때문에).

이슈8 : (7/5 21:30) 190개의 friends_timeline을 파이썬 모듈을 사용에 리턴받는 프로그램 작성.
모든 내용을 하나의 문자 배열에 저장하므로 추후 파싱작업이 필요함.
  • 처리해야 할 문제 : 현재 사용하는 api의 기능중 레퍼런스보드에서 사용할 수 있는 것들을 파악하여 프로젝트에서 구현해야 할 부분을 결정해야 한다.

이슈9 : (7/6 11:30) python-twitter API의 기능들을 확인하던 중. 메시지를 보낼 때에도 ascii -> unicode 문제가 있는것을 발견.
다음과 같이 한글을 아무런 처리 없이 보낼결우 에러가 발생한다.

>>> stauts = api.PostUpdate("아놔...kbs")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "build/bdist.linux-i686/egg/twitter.py", line 1494, in PostUpdate
  File "build/bdist.linux-i686/egg/twitter.py", line 2014, in _FetchUrl
  File "build/bdist.linux-i686/egg/twitter.py", line 1967, in _EncodePostData
  File "build/bdist.linux-i686/egg/twitter.py", line 1932, in _Encode
UnicodeDecodeError: 'ascii' codec can't decode byte 0xec in position 0: ordinal not in range(128)

대처 : 다음과 같이utf-8로 디코드하면 해결가능.
>>> text = "아놔 kbs"
>>>stauts = api.PostUpdate(text.decode('utf-8'))


이슈10 : (7/11 20:20) python-twitter 의 API 문서에서 명시적으로 설명하고 있지 않아서 그 동안 존재를 모르고 있던 함수들을 발견. 
1. 현재 api인스턴스의 ID.PW를 삭제하는 함수. 로그아웃으로 활용 가능함
2. 캐쉬 시간을 조절하는 함수
이 함수를 발견하기 전까지는 서버에서 스테이터스를 받아오려고 계속 시도해도 캐쉬의 내용을 그냥 뿌려주었기 때문에 새로운 메시지를 받는데 오래 걸렸음. 이제부터는 거의 실시간으로 변경사항을 업데이트할 수 있음.
3. try, except 문법을 활용하여 계정 정보를 잘못 입력하였을 경우 다시 로그인 할 수 있는 있는 기능을 구현할 수 있음.

이 기능들을 구현한 코드는 첨부하였음. 파일명 get_friends_timeline.py


Comments