ctypes 요약

살다보면 파이썬에서 C언어로 만들어진 DLL파일을 써야 할 일이 있을 수도 있다. 적어도 난 그랬다. 그래서 그걸 하기 위해 많은 해법들을 찾아보았지만, SWIG라든가, 그런것들은 나에게 도움이 되지 않았다. 그래서 ctypes를 공부했다.

일단 사용하기 위해서는 import ctypes로 불러와야 한다. 그러면 ctypes가 메모리에 적재된다.

다음 순서는 내가 사용할 DLL파일을 알려주는 것이다.

myDLL = ctypes.WinDLL(‘myDLLfile’)

위와 같이 쓰면 된다. 이 때, 이걸 사용하고 있는 파이썬 프로그램 파일(.py)의 경로에는 myDLLfile.dll 파일이 존재해야 한다. 이렇게 하면 이제 파이썬은 내가 무슨 라이브러리를 가져다 쓰고싶은건지 알게 되었다.

그 다음, DLL파일이랑 같이 주어진 헤더 파일(.h)을 살펴보고서, DLL파일에 있는 여러 함수 중 뭘 가져다 쓸 것인지 정해야 한다.

사실 헤더파일의 내용을 파이썬의 내용으로 번역하는 것과 별다른게 없는데, C언어 헤더파일에 정의된 내용은 함수의 이름, 함수가 받을 변수의 수와 형, 함수가 되돌려줄 변수의 형이 있다.

mypythonfunc= myDLL[‘MY_C_FUNC’]

위와 같은 한 줄을 적어 줘서, DLL파일의 라이브러리 중 어떤 함수를 쓰고 싶은지 적어주고, 그 함수를 내가 어떤 이름으로 쓸건지 알려주면 된다. 하지만 이것만으로는 저 함수의 모든 것을 알려준 것이 아니다.
mypythonfunc.argtypes = (ctypes.c_int,ctypes.c_double)

위와 같이 argtypes를 지정해 주는데, 이것은 이 함수가 변수로써 어떤 형식을 받을 건지 알려주는 변수이다. 근데 내가잘못 사용한건지는 모르겠지만, 변수의 수가 1개일 때는 에러가 나서 지정해주지 않았다. 지정해주지 않더라도 헤더 파일에 정의된 형으로 잘 넘어가기만 한다면 에러는 나지 않는다.

imct_initialize.restype = ctypes.c_int

restype은 함수가 되돌려주는 값의 형, 즉 반환형이다.

이렇게 하고 나면, 이제 mypythonfunc(a, b)를 가져다 쓰기만 하면 된다.

하지만, 문제가 있다. C언어에는 포인터라는 녀석이 있는데, 함수가 포인터를 통해서 자료를 주고받는 경우에는 restype을 아무리 써봐야 어쩔 수 없다. 포인터를 선언해줘야 한다.

이런 경우 argtypes에는 ctypes.c_void_p를 쓰거나, ctypes.POINTER(ctypes.c_int)를쓴다. ctypes.POINTER의 안쪽에 들어가는 변수는 실제 포인터 선언에 사용한 변수의 형을 써주면 된다.

이렇게 하고서, 만약 다음과 같이 써져 있다고 해 보자.

mypythonfunc.argtypes = (ctypes.POINTER(ctypes.c_int),ctypes.c_double)

그럼 mypythonfunc(a, b)처럼 사용할 때 a에는 포인터 변수를 넣어줘야 한다. 하지만 파이썬에는 포인터라는 개념이 없다. 그래서 만들어 줘야 한다.

일단 포인터 형이 ctypes.c_int니까 x=ctypes.c_int(0) 처럼 선언한다. 0은 초기값이다. 그런 다음 mypythonfunc(ctypes.byref(a), b) 처럼 사용하면된다. byref는 ctypes에서 “참조형 변수”로 값을 전달하는 함수이다. 이렇게 한 후 함수를 실행시키면 a의 값이 함수의 실행 결과에 따라 바뀌어 있음을 알 수 있다.

예를 들어 ctypes.c_int(4)를 4와 비교하고 싶다고 해 보자. 이걸 ctypes.c_int(4) == 4 이렇게 비교를 하자고 하면 False가 뜰 것이다. ctypes.c_int(4).value 로 그 내부의 값을 불러와야 한다. 만약 m = ctypes.c_int(4)로 선언되어 있었다면 m.value를 써줘야 파이썬에서 사용하는 값이 빠져나온다.

배열을 통째로 넘길 때는 어떻게 해야 할까?

mypythonfunc.argtypes = (ctypes.c_void_p, ctypes.c_double)

배열은 argtypes에 들어가는 경우 ctypes.c_void_p로 형을 지정해 주면 된다. 그리고 파이썬의 배열을 넣어주면 되는데, 파이썬의 배열이 C의 배열과 같을리가 없다. 그래서 이렇게 해줘야 한다

myarray = ctypes.c_int * 8

이렇게 하면 myarray는 int를 8개 가지는 type이 된다. 여기서 중요한건 myarray는 변수가 아니라 types이라는 것이다. 그 다음 함수에 값을 넣을 때는

mya = myarray(0,1,2,3,4,5,6,7) 처럼 변수를 하나 새로 만들어서

mypythonfunc(mya, b) 처럼 함수를 불러와야 한다. 이 경우에는 byref를 쓰지 않아도 참조형으로 변수가 넘어가기 때문에 mya는 함수의 실행 결과에 따라 바뀌게 된다. 만약 그 결과로 나온 mya를 다시 파이썬에서 사용하는 배열로 고치고 싶다면 list(mya)를 써서 파이썬의 배열로 바꿔줄 수 있다.

https://docs.python.org/3.6/library/ctypes.html

https://docs.python.org/2/library/ctypes.html

위의 참고문헌을 잘 읽어보고 사용하도록하자.

The final countdown

노래: Europe
We’re leaving together,
But still it’s farewell
And maybe we’ll come back
To earth, who can tell?
I guess there is no one to blame
We’re leaving ground (leaving ground)
Will things ever be the same again?
It’s the final countdown
The final countdown
Oh
We’re heading for Venus (Venus)
And still we stand tall
‘Cause maybe they’ve seen us (seen us)
And welcome us all, yeah
With so many light years to go
And things to be found (to be found)
I’m sure that we’ll all miss her so
It’s the final countdown
The final countdown
The final countdown
The final countdown
Oh
The final countdown, oh
It’s the final count down
The final countdown
The final countdown
The final countdown
Oh
It’s the final count down
We’re leaving together
The final count down
We’ll all miss her so
It’s the final countdown
It’s the final countdown
Oh
It’s the final countdown, yeah

2차 한국전쟁은 일어날 수 있을까?

최근 북한이 계속 도발을 하고 있어서 한반도의 위기감이 점점 고조되고 있다. 하지만 내 생각에 2차 한국전쟁은 일어날 것 같지 않다. 그 이유는 다음과 같다.

전쟁은 1.전쟁을 일으키지 않고 얻을 수 있는 이득보다 2.전쟁을 일으켜서 승리했을 때 얻을 수 있는 이득이 3.전쟁을 일으켜서 잃을 것들을 감안하더라도 확실히 클 때 일어날 수 있다. 여기에 4. 전쟁에서 이길 수 있다는 확신이 있어야만 실제로 발생한다. 물론 역사적으로 세계적으로 1,2,3,4에 대한 검토 없이 그냥 일어난 전쟁도 많았지만, 2차 세계대전 이후로 일어나는 전쟁들은 대체로 위의 1,2,3,4를 한번쯤은 생각한 후에 일어난다.

북한에서 전쟁을 일으킬 수 있으려면 일단 4.전쟁에서 이길 수 있다는 확신이 들어야 하는데, 아무리 봐도 북한 정권이 생각이 있으면 그런 판단을 할 것 같지 않다.

전쟁에서 이기기 위해서는 다양한 요소들을 고려해야 한다. 군사의 규모가 충분해야 하고, 그 군인들이 충분히 잘 훈련되어 있어야 하며, 적진에서 작전을 수행하면서 필요한 물자들을 보급할 수 있는 생산력과 수송력이 뒷받침되어야 한다. 여기에 추가로 고려해야 하는 수많은 요건들이 있지만 가장 중요한 것이 이정도라고 하겠다. 만약 이 중에서 하나라도 부족하면 전쟁에서 승리하기를 기대하기 어렵다.

군사의 규모를 비교해 보자. 군사의 규모 자체는 남북한이 비슷하다. 하지만 실제 전쟁이 벌어진다면 여기에 미국과 일본의 참전이 기정사실이기 때문에 남한이 군사력에서 밀릴 것 같지 않다. 반대로 북한의 동맹이나 우방이라 할 수 있는 중국이나 러시아는 2차 한국전쟁이 벌어졌다고 해도 참전이 기정사실이라고 보기 어렵다. 잘해야 북한군의 전쟁과 전투를 방해하지 않는 수준의 소극적 지원에 그칠 것이다. 내가 이렇게 생각하는 이유는 이미 냉전이 끝난 상황이고, 중국과 러시아가 한국전쟁에 참전하려면 앞에서 적었던 1,2,3,4에 대해서 또한 자기네 나름대로의 계산을 해야 하는데 북한이 여기에 중국과 러시아에 확신을 줄 수 있을 것 같지 않다. 가령, 북한이 전쟁에 승리해서 남한을 점령했다고 치자. 남한의 생산력을 그대로 재활용해서 중국과 러시아에게 경제적 이익을 줄 수 있을까? 공장은 전쟁하느라 다 파괴되어 있을 거고, 파괴되지 않았더라도 북한의 통제 경제 체제에서 도달할 수 있는 생산력은 현재 남한이 보여주는 생산력에 매우 못 미칠 것이다. 중국은 지금 외교, 경제적 분야에서 남한과 사이가 안좋긴 하지만, 아무리 그렇다 해도 북한이 남한을 점령했을 때 얻을 경제적 이익이 그리 크지 않다. 또한, 중국이 참전한다면 미국과 중국이 정면대결하게 되고, 그것은 결국 세계대전급으로 전쟁이 확대될 가능성을 의미하는데, 한반도에 국한된 전쟁이라면 모를까 중국은 세계대전을 치르고 싶은 생각이 전혀 없을 것이다. 세계대전으로 전쟁이 확대되면 NATO는 반드시 참전할 것이고, NATO와 엮인 유럽연합도 직접이든 간접이든 미국편을 들 가능성이 높다. 이렇게 되면 승리를 장담하기도 어렵고, 중국이 얻을 수 있는 이익에 비해 전쟁을 치르면서 입을 손해가 더 클 가능성이 높다. 차라리 현재 상태를 유지하면서 미국에 물건을 팔고 경제적 이득을 취하는 것이 전쟁보다 훨씬 쉽고 이익이다. 러시아도 마찬가지인데, 러시아가 물론 엄청 거대한 국가이고 군사력 역시 미국에 비해 뒤떨어지지 않지만, 그렇다고 해서 전쟁을 치르고 싶을리가 없다. 전쟁이란 어디까지나 결국 군인의 싸움이고, 군인은 모두 국민이다. 그리고 그 어떤 국민도 죽고싶어하지 않는다. 2차 세계대전때의 나치당이나 일본군 수뇌부 정도로 미친 놈들이 아니고서는 말이다. 러시아 정부가 그렇게까지 미쳐있을까? 그럴리 없다. 분명히 손익계산을 펼칠 것이고, 세계 제1의 경제, 군사 대국인 미국이 참전하는 이상 엄청난 손해는 확정적이고 그에 비해 승리는 확정적이지 않다. 이런 이유로 북한의 우방인 중국과 러시아는 북한이 한국전쟁을 일으키더라도 참전하지 않을 것으로 본다. 그 외에 북한과 친하게 지내는 국가들이 있지만, 너무 멀리 떨어져 있어서 파병을 하더라도 그들의 군대가 전쟁 상황인 한반도에 도달할 수 없다.

군인들의 훈련 상태를 보자. 이쪽은 더 한심하다. 북한군은 물자 부족으로 실탄 훈련을 거의 하지 못한다. 많이 잡아봐야 수만명 규모로 볼 수 있는 특수부대가 실탄 훈련을 해봤겠지만, 알다시피 대한민국 국군은 현역 장병 전부는 물론이고 예비군까지 1년에 수십발씩 실탄 훈련을 한다. 물론 특수부대 수만명은 승승장구할 수도 있겠지만, 전쟁은 그렇게 해서는 승리할 수 없다. 그 수만명이 한 지역을 오랫동안 점령하고 있을 수도 없고, 일반 보병 부대가 결국 점령을 유지해야 하는데 그걸 유지할 일반 부대의 훈련 상태를 비교하자면 비교하는게 모욕일 정도로 국군이 우수하다. 심지어 아직 현재 전세계 어딘가에서 실전에 투입되고 있는 미군은 빼고 생각하는 중이다.

북한군이 남침하면 보급은 어떻게 해야 할까? 물론 북한군이 남침으로 내려오면 마트같은거 다 털고 주유소 다 털어서 보급할 수도 있을 것이다. 하지만 그럼 국군은 바보인가? 당연히 마트는 털어도 국군이 먼저 털 것이고 만약 국군이 패퇴하는 경우에는 북한군이 사용하지 못하도록 확실하게 파괴해서 없앤 후에 후퇴할 것이다. 결국 북한군은 북한 현지에서 남한으로 자체적으로 보급을 해야 하는데, 알다시피 북한의 연료 사정과 식량 사정은 개판이다. 이걸로 보급을 해봐야 국군의 병참, 보급을 따라갈 수가 없다. 남한과 북한은 경제력, 생산력 차이가 이미 어마어마하게 벌어져 있고, 만약 북한이 “전쟁”을 준비한다면 핵무기가 아니라 일단 자체적인 생산력을 강화해서 보급이나 어떻게든 할 수 있게라도 해야 할 것이다. 우리가 북한의 식량 사정이 어떤지 뻔히 아는 상황에서 국군에 대한 보급이 딸릴 거라고 생각하는건 진짜 모욕이다. 물론 국군에 어떤 정신나간 간부가 있어서 보급을 빼돌리는 상황이 벌어질 수도 있겠지만, 그런게 가능했던 건 1950년에나 그랬지 지금은 그럴 수 없다. 또, 그렇게 해서 일부의 보급이 빼돌려진다 하더라도 북한에 비해서는 충분히 보급이 이뤄질 것이라 본다.

이와 같은 이유로 북한군의 남침을 가정하는 경우, 국군의 승리는 얼마나 군인과 민간인의 손실을 줄이느냐의 문제일 뿐 승리 자체는 기정사실이라고 본다.

북한이 전쟁을 하고 싶으면 위와 같은 조건들을 일단 개선한 후에 4번 항목 “이길 수 있다는 확신”이 들어야 한다. 만약 북한 정권이 그런 개선 없이 이길 수 있다는 확신이 들었다면, 틀린 확신에 의해 일어난 전쟁이므로 정말 우리 국군이 질래야 질 수가 없다.

핵무기의 상황은 어떠할까? 최악의 상황을 가정해서, SLBM이나 ICBM의 개발이 완료되고, 여기에 탑재 가능한 수소폭탄이 실전배치가 되었다고 해 보자. 이걸 어디에 쓸 수 있을까? 북한이 이걸 미국 본토에 쏜다고 해 보자. 잘해야 20발 정도 있을텐데, 미국 본토에 20발 쏴봐야 그 넓은 나라에서 큰 피해는 입지 않는다. 대도시에 쏴서 민간인을 수백만명씩 많이 죽여봐야 미군 군사력은 그대로 남아있을 것이고, 그렇다고 미군 군사기지에 쏘자니 그건 너무 좁은 영역이라 맞추기도 어려울 뿐만 아니라 맞춘다 하더라도 20곳이 넘는 미군 군사 기지를 전부 없애는 것은 불가능하다. 또한, ICBM이나 SLBM은 날아오는데 시간이 걸리므로 그 모든 미사일이 전부 성공한다는 보장도 없다. 그리고 이런 미사일들이 미국 본토를 향하고 있다는 것이 확인된 순간 미국은 그보다 “확실하게 더 많은” 핵무기를 고민하지 않고 북한 본토에 쏠 것이다. 김정은이 어디 숨어있을지는 모르겠지만, 아마 죽을 것이다. 이런 이유로 미국에 쏘는건 미친 짓이다. 같은 이유로 일본에 쏘는 것도 미친짓이다.

남한에 쏜다면 어떨까? THAAD가 배치되면 요격할 수 있을지도 모른다. 하지만 많은 전문가들이 지적했듯이 핵무기를 남한에 쏘는건 낭비중의 낭비다. 한반도는 핵무기를 쏘기엔 너무 좁다. 사람은 많이 죽일 수 있겠지만, 그걸로 끝일 뿐 북한의 멸망은 기정사실이다. 한반도에 핵무기를 쏘는 것이 확인된 순간, 미국이 역시 핵 보복을 가할 것이고, 최소한 평양은 그날부로 지도에서 사라질 것이기 때문이다.

이런 이유로 핵무기는 결국 자신들의 손에 들고서 다른 나라들을 협박해서 돈을 뜯어내기 위한 “대화 수단”이지 그걸 실제로 사용할 것이라는 생각은 하기 어렵다. 또한, 핵무기를 들고 있어도 “전쟁에서의 승리”는 확신할 수가 없다. 위에서 말했듯이 재래식 전력이 너무 빈약해서 전쟁을 수행할 수 없기 때문이다. 이게 성공하려면 남한이 엄청나게 외교를 잘못해서 미국, 일본, 유럽과 동맹과 모든 교류가 끊어질 정도의 최악의 상황이어야만 한다. 그리고 알다시피 남한은 그럴 정도의 지도자가 대통령이 되면 그자를 탄핵시켜버릴 국민이 있다.

그렇다면 전쟁을 일으켜서 얻을 수 있는 이득이 전쟁에 소모되는 자원과 전쟁으로 입을 손해보다 확실하게 더 클 것인가? 최악의 경우에 대한 가정에 가정을 더해서 북한군의 남침이 성공했다 치자. 즉, 한반도가 적화 무력 통일이 되었다고 가정해 보자. 일단 북한 주민의 수가 2천만명인데 남한 국민의 수가 5천만명이다. 북한에는 변변한 기반시설이 없고 남한측은 전쟁으로 다 파괴된 상태다. 갑자기 7천만명으로 늘어난 “국민”중에서 5천만명이 “불순분자”다. 이걸 더 적은 2천만명의 충성심으로 통제하는 것은 매우 어려운 일이고, 알다시피 북한 주민들이 정권에 대한 충성심이 그다지 높지 않다. 즉, 공포정치와 선군정치로 간신히 틀어막고 있던 북한의 불순분자들이 순식간에 몇배로 늘어난다는 뜻이다. 게다가, 북한은 이 상태에서 점령군 입장이므로 남한에 있던 기존의 군대 병력이나 경찰력을 이용할 수 없다. 점령 이후 적어도 몇년간은 게릴라식으로 저항군이 남아있을 것이니 이들은 전부 어디 수용소로 보내든가 처형해야 할 것이다. 그럼 이번엔 5천만명의 민간인에 대한 치안 유지가 문제다. 북한이 전쟁 후 발전을 하려면 일단은 민간에 대한 치안이 확보가 되어야 하는데, 이것은 불가능한 일이다. 즉, 북한은 승전 후에도 경제성장같은걸 할 수가 없다. 물론 남한 민간인 5천만명을 노예로 삼아서 뭔가를 해볼 수도 있겠지만, 방금 말했듯이 통제 자체가 불가능한데 노예로 쓸 수 있을리가 없다. 우리가 바보도 아니고…

심지어, 이런 경우 중국이나 러시아가 “그제서야” 생색내기로 군대를 보내서 전후 복구와 치안 유지를 도와주고, 그에 대한 보상을 요구할 수도 있다. 그럼 북한은 거절할 수 없다. 북한이 남한을 차지해서 얻을 수 있는 이익은 절대 독점할 수 없고, 소화시킬 수도 없다.

나는 이와 같은 이유로 2차 한국전쟁은 일어나기 어려운 상황이라고 생각한다. 물론 이런 생각을 한다고 해서 국가 안보에 방심하고 있으면 안된다. 위에 작성한 것들은 전부 우리 국민 모두가 국가 안보 정신이 충실하고, 국군이 전시에 대비해서 훈련을 게을리하지 않는다는 전제를 바닥에 깔고 있기 때문이다. 물론 사실 가장 위험한 고리는 김정은이 그렇게까지 멍청한 인간은 아니라고 하는 전제이긴 한데, 이건 내가 걔랑 대화를 해볼 수가 없으니 가정으로 남을 수 밖에 없는 부분이다.

Proudly powered by WordPress | Theme: Baskerville 2 by Anders Noren.

Up ↑