기본 콘텐츠로 건너뛰기

라벨이 Python인 게시물 표시

Networkx 라이브러리 활용법

  Networkx 라는 그래프에 관련된 훌륭한 라이브러리가 있습니다. 이 라이브러리에 관련된 여러 글들을 인터넷에서 찾아보고 지금 진행하고 있는 Cable Auto Routing에 적용할 수 있다는 것을 알게되었습니다. Cable Auto Routing은 두 장치를 연결하는 Cable의 최단 경로를 자동으로 찾는 것입니다. Networkx 의 shortest_path라는 함수를 이용하여 출발 노드에서 종료 노드에 도달하는 최단 경로를 구할 수 있습니다. $$path = \text{nx.dijkstra_path}(G, \text{start_node}, \text{end_node}, weight)$$ 아마 shortest_path 함수도 내부적으로 dijkstra 알고리즘을 사용할 것 같습니다. Cable Auto Routing 프로젝트에서 dijkstra 알고리즘을 직접 구현하여 문제를 해결할 수도 있겠지만 이미 검증된 라이브러리를 사용하는 편이 훨씬 효율적이고(알고리즘 구현에 시간을 낭비할 필요가 없습니다.) 안전할것 입니다. 이 라이브러리를 Cable Auto Routing에 적용하기 전에 기능 테스트를 위한 데모 프로그램을 작성하기로 하였습니다.  데모 프로그램은 아래와 같은 기능을 가집니다. 최단 거리 검색 노드 생성 에지 생성 노드, 에지 정보를 파일로 저장 및 저장된 파일 읽어오기 Open 툴바를 눌러 노드와 에지 정보가 저장된 Json 파일을 읽습니다. Networkx 툴바를 누르면 Networkx 관련 다이얼로그가 나타납니다. Find 버튼을 눌러 사용자가 입력한 출발 노드에서 종료 노드까지의 최단 경로를 검색합니다. 결과 화면(노란색이 최단 경로) 노드를 생성할때 노드 이름과 3D 좌표를 입력합니다. 사실 Networkx에서는 3D 좌표는 필요없습니다. 데모 프로그램에서 3D로 노드를 표시해주기 위해 3D 좌표를 입력하도록 하였습니다. 에지는 에지를 구성하는 두 노드 이름과 에지의 길이를 입력하도록 하였습니다. 에지의 길이는 에...

[PyQt5] 화면 디자인

 PyQt5를 이용하여 어플리케이션을 개발할때 화면은 당연히 QtDesigner를 통해 만들게 됩니다. QtDesigner는 PyQt5 패키지를 설치하면 같이 설치됩니다. designer.exe로 검색하시면 찾을 수 있을겁니다. Qt Designer QtDesigner를 통해 만들어진 ui 파일을 프로그램에 적용하는 방법은 먼저 ui 파일을 ui 컴파일러를 통하여 Python 코드로 변환합니다. pyuic5 XXX.ui -o XXX_UI.py 1. Qt Designer에서 다이얼로그 생성 2. ui 파일 3. ui 파일을 통해 자동 생성된 python 코드 그리고 변환한 코드를 Wrapping한 클래스를 만들어 사용하면 됩니다. 이렇게 친절하게 저희 직원에게 소개해줬더니, 아직도 커맨드 명령어를 사용하느냐, 그리고 컴파일러를 이용하여 Python 코드를 만든 후 또 Wrapping 클래스 만들어야 하느냐 C#에 비해 불편하고 복잡하다는 대답을 들었습니다. 맞는 말입니다. C#에 비해 불편합니다. 위 방법에 비해 좀더 간편한 방법이 있긴합니다. ui 파일을 컴파일하여 Python코드를 만들어 사용하지 않고 바로 사용하는 방법입니다. class QSpinnerPane ( QWidget ) : def __init__ ( self ) : import os from PyQt5 import QtWidgets , uic   QWidget. __init__ ( self ) ui_path = os . path . join ( os . path . dirname ( os . path . realpath ( __file__ ) ) , 'UI' , 'Spinner.ui' ) uiClass , qtBaseClass = uic. loadUiType ( ui_path ) self . ui = uiClass ( ) self . u...

[Jenkins] Python 가상 환경 빌드

Jenkins에서 Python 가상 환경을 빌드하는 방법에 대한 설명입니다. Freestyle 프로젝트 대상으로 설명하겠습니다. Global Properties에서 가상 환경 경로를 설정합니다. Build Step에서 Execute Windows batch command 탭을 추가합니다. 설정한 VirtualEnv를 이용하여 프로젝트의 가상 환경을 생성합니다. 가상 환경을 활성화 시킵니다. $$\text{.\Your Project\.venv\scripts\activate.bat}$$ 패키지 목록을 이용하여 프로젝트에 필요한 패키지들을 설치합니다. 패키지 목록을 만드는 방법은 이전 글에서 확인할 수 있습니다. $$\text{pip install -r .\requirements.txt}$$ PyInstaller를 이용하여 프로젝트를 빌드합니다. pyinstaller 에 대한 자세한 내용은 여기서 확인하시면 됩니다. $$\text{pyinstaller .\App.spec --onedir -p ".\Your Project\.venv\Lib\site-packages\PyQt5" -w --log-level=DEBUG -y}$$ 가상 환경에서 빠져나옵니다. $$\text{deactivate.bat}$$ 가상 환경을 활성화시켜 작업을 수행하고 빠져나오는 부분을 batch command로 작성하려면 각각의 부분을 &으로 연결시켜 하나의 command로 만들어줘야 합니다. 그렇지 않고 각각 하나의 command로 실행시키면 가상 환경 하에서 빌드를 수행할 수 없습니다.(activate.bat로 활성화된 가상 환경이 command가 종료되면 사라집니다.)

[Python] 가상 환경 구축

  Global 파이썬 환경에 모든 프로젝트의 모듈들을 설치하다보면 모듈간의 의존성, 버전 문제가 발생할 수 있습니다. 이러한 문제들을 방지하기 위해 프로젝트별 가상 환경을 구축하는 것이 좋습니다. 아래는 가상 환경을 구축하는 절차입니다.( PyCharm 기준으로 설명합니다.) 가상 환경 구축 프로젝트 폴더에서 Command 창을 열어 아래 명령 실행합니다. .venv는 생성할 폴더 이름입니다. 다른 이름으로 폴더를 생성해도 됩니다. virtualenv .venv virtualenv 패키지가 설치되어 있지 않으면 아래 명령으로 설치합니다. pip install --upgrade virtualenv 새로운 프로젝트 생성 Virtualenv로 프로젝트를 생성하시면 됩니다. 기존 프로젝트 가상 환경 설정 Setting에서 Python Interpreter 탭을 클릭합니다. Interpreter 콤보 박스의 맨 아래 Show All을 클릭합니다. 맨 아래 [+] 버튼을 클릭합니다. Existing Environment 항목을 선택합니다. [OK] 버튼을 눌러 설정을 저장합니다. 가상 환경을 적용하기 위해 PyCharm을 종료하고 재실행 합니다.(Terminal에서 아래와 같이 가상 환경이 적용된것을 확인합니다.) 가상 환경에 설치되어 있는 패키지들의 목록을 파일로 추출하여 패키지를 설치할 수 있습니다.      pip freeze > requirements.txt : 패키지 목록 추출      pip install -r requirements.txt : 목록 파일을 이용하여 패키지 설치 requirements.txt 대신 다른 파일 이름을 사용할 수 있으나 일반적으로 requirements.txt를 사용합니다.

Python 배포하기

MFC로 만든 프로그램에 python을 embedding하여 사용중인데 배포에 문제가 발생했습니다. 즉 python이 설치된 컴퓨터에는 제대로 작동하나 그렇지 않은 컴퓨터에는 python 코드가 실행되지 않는다는 겁니다.(py2exe로 python dll과 library.zip 파일을 생성) 그렇다고 모든 사용자들에게 python을 설치하고 프로그램을 실행하라고 할 수도 없는 일이구요... 그래서 구글링을 하여 찾아보니 python에 있는 DLLs와 Lib 폴더를 프로그램 폴더에 복사하여 배포를 하면 된다고하여 그렇게 해보았더니... 성공!!! 프로그램 폴더 구조 + 응용 프로그램 pythonxx.dll  -- + python    -- + DLLs : python에 있는 DLLs 폴더에 있는 모든 파일을 복사합니다.    -- + Lib : python에 있는 Lib 폴더에 있는 모든 파일을 복사합니다. 이렇게 하니 단점은 프로그램 배포 파일의 크기가 커진다는거~~ DLLs,Lib 폴더를 압축하여 배포 파일을 생성하였는데도 기존보다 약 10M 정도가 큽니다.

Python embedding 4 - PyErr_Print() 를 파일로 남기기

원문 보기 파이썬 임베딩을 하면서 가장 유용하게 사용되는 함수 중에 하나가 PyErr_Print()라고 하면, 대부분 공감 하시리라 믿습니다. PyErr_Print()를 통해 우리는 파이썬 모듈을 로드하고 실행하는 중에 발생하는 모든 에러들과 예외 들에 대해 성실하고도 친절한 답변을 받게 됩니다. 그런데 가끔은  PyErr_Print()가 보여 주는 메시지들을 보지 못하는 환경에 놓일 때가 있습니다 . 예를 들자면 윈도우의 서비스 프로세스나 리눅스의 데몬 프로세스 같은 경우지요. 앞에 말한 두 종류의 프로세스들은 프로세스의 특성상 stdout 이라던지 stderr과 같은 표준 출력을 지원하지 못하도록 막아 버리는 경우가 대부분 입니다. 그리고 우리의 PyErr_Print()함수는 stderr을 통해서 메시지를 보여 주도록 되어 있는데, stderr이 막혀 있으니 어디로든지 메시지를 전달 할 수 있는 방법이 없는 것 입니다. 그럼 이런 프로세스들은 아예 볼 방법이 없는가라고 물으 실지도 모르겠습니다. 당연히 방법이 있지요. 방법이 없었으면 포스트 시작 하지도 않았습니다. 간단하고 일반적 방법으로는  stderr의 출력을 파일 출력으로 리다이렉션 하는 방법 이 있습니다. 그리고 가끔은 메시지 박스등에 출력 해주기 위해서 특정 버퍼로 출력을 원하시는 분들도 있습니다. 이 포스트에서는 첫 번째 방법에 대해서만 설명할 것입니다. 두 번째 방법에 보다 더 흥미를 느끼는 분은 ' how to get string printed by PyErr_Print( ) ?"를 추천 드립니다. 자, 이제 부터 ' PyErr_Print()의 메시지를 파일로 출력 하는 방법 '에 대해서 살펴 보도록 하겠습니다. 기본 개념은 간단 합니다.  sys.stderr에 우리가 출력하길 원하는 파일의 파일 객체를 넣어 주기만 하면 됩니다 . 그러기 위해서는 먼저 파일 객체를 만들어 주어야 하겠지요. 아래의 코드를 한번 살펴 보도록 하겠습니다 :...

Problem with COM and MsExcel (Brunain Christophe)

■ 파이썬_02 [python-win32] Re: Problem with COM and MsExcel (Brunain Christophe) Niels Steen Krogh nielssteenkrogh@hotmail.com Wed, 02 Apr 2003 19:45:31 +0200 Previous message: [python-win32] Problem with COM and MsExcel Next message: [python-win32] "Casting" COM objects Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] -------------------------------------------------------------------------------- Hi! This script might help you - use CoInitialize ..... It helped me in a situation similar to yours. Good luck Niels from win32com . client import Dispatch from pythoncom import CoInitialize , CoUninitialize CoInitialize ( ) #start com thread - kan udelades, men vil mindske stabiliteten o = Dispatch ( "Excel.Application" ) #start excel o . Visible = 0 #excel k?rer i baggrunden o . Workbooks . Open ( Filename = 'c:\\dokumenter\\mappe14.xls' ) #get the workbook o . Workbooks ( 1 ) . Sheets ( 1 ) . Cells . ...

[python] dictionary sorting

■ 파이썬_02 [python] dictionary sorting 딕셔너리.. 맵에 데이터를 넣고 정렬할게 생겨서... 할려다 보니... 어찌해야 하나 고민이 되었습니다. 음... c++의 stl에서는 잘 되는것인데... 그래도 찾다보니 key값으로 sorting하는것은 dickeys = dic.keys() dickeys.sort() for i in dickeys: print i, dic[i] 그러면... value로 sorting 하는 방법은... diclist = [] for i in dic.keys(): diclist.append( (i, dic[i]) ) diclist.sort( key = lambda(x,y):y ) for i in diclist: print i[0], i[1] 음... 이 방법 이외에... from operator import itemgetter dict = {} dict['a'] = 2 dict['b'] = 1 dict['c'] = 5 print sorted(dict.iteritems(), key=itemgetter(1), reverse=True) 로 하게 되면... value의 값으로 정렬을 하게 된다는거... 음... python.. 쉬우면서도 어려운... ㅎㅎ

Python

■ 파이썬_01 Nabble.addCssRule(document.styleSheets[0],'.nabble a:link','color:'+document.linkColor); Nabble.addCssRule(document.styleSheets[0],'.nabble a:visited','color:'+document.vlinkColor); if (!Nabble.isEmbedded) { document.write('Nabble | Old Nabble1'); } else if (false) { document.write('Back to the forum'); } Nabble | Old Nabble1 | Software ≫ SourceForge ≫ SWIG ≫ swig-user Login : Register Nabble.userHeader(3366); Swig Python/Autocad binding View: Threaded Chronologically All Messages Nabble.selectOption(Nabble.get("nabble.viewSelect"),Nabble.tview); New views 9 Messages ? Rating Filter: 0 1 2 3 4 5 Alert me if( Nabble.user == 799921 || Nabble.user == 77858) { document.writeln('Move thread'); } Swig Python/Autocad binding document.write(Nabble.ratingStars(3)); by document.write(' Mick Duprez document.write(''); document.write(Nabble.formatDateLong(new Date(1219651075018))); Aug 25, 20...

python

■ jwFreeNote_01 Ked   Russia    (524 posts)     bio Date Fri 09 Sep 2005 11:16 AM (UTC) Amended on Fri 09 Sep 2005 12:50 PM (UTC) by Ked Message I found a recipe on ActiveState's Cookbook that shows how to change colours of an application's menu, and immediately recalled that Mushclient has that world.GetFrame callback. So here's a function that will add some colour to the menu bar in Mushclient. This requires you to have the ctypes package installed (in addition to a working Python installation of course). Ctypes is a tiny extension that allows you to call native DLL's - both *nix and Windows - directly from Python without requiring any additional wrapping. """ Borrowed from ASPN Cookbook recipe: aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440507 """ import win32con from ctypes import * # Structure passed to CreateSolidBrush function # Represents RGB class COLORREF(Structure): _fields_ = [ ("...

[IronPython] 변수로 함수 넘기기

SetVariable 함수로 C# 함수를 넘기는 것을 알아 보겠습니다. 먼저 public 함수를 하나 만드시구요, public class FuncForScript { /// <summary> /// return digit part from string /// </summary> /// <param name="sFromString"></param> /// <returns></returns> static public string GetDigitFromString(string sFromString) { string sDigitString = string.Empty; sFromString = sFromString.Trim(); foreach (char c in sFromString) { if (!char.IsLetter(c)) { sDigitString += c; } else { break; } } return sDigitString; } } ScriptScope에서 아래와 같이하여 함수를 넘길 수 있습니다. 1 2 oScriptScope.SetVariable( "GetDigitFromString" ,  new  Func < string ,  string > (FuncForScript.GetDigitFromString)); Colored by Color Scripter cs 이렇게 하면 Python Code에서  아래와 같이 GetDigitFromString함수를 사용할수 있습...