{"id":11286,"date":"2017-09-26T02:25:48","date_gmt":"2017-09-25T17:25:48","guid":{"rendered":"http:\/\/melotopia.net\/b\/?p=11286"},"modified":"2017-09-26T02:25:48","modified_gmt":"2017-09-25T17:25:48","slug":"ctypes-%ec%9a%94%ec%95%bd","status":"publish","type":"post","link":"http:\/\/melotopia.net\/b\/?p=11286","title":{"rendered":"ctypes \uc694\uc57d"},"content":{"rendered":"<p>\uc0b4\ub2e4\ubcf4\uba74 \ud30c\uc774\uc36c\uc5d0\uc11c C\uc5b8\uc5b4\ub85c \ub9cc\ub4e4\uc5b4\uc9c4 DLL\ud30c\uc77c\uc744 \uc368\uc57c \ud560 \uc77c\uc774 \uc788\uc744 \uc218\ub3c4 \uc788\ub2e4. \uc801\uc5b4\ub3c4 \ub09c \uadf8\ub7ac\ub2e4. \uadf8\ub798\uc11c \uadf8\uac78 \ud558\uae30 \uc704\ud574 \ub9ce\uc740 \ud574\ubc95\ub4e4\uc744 \ucc3e\uc544\ubcf4\uc558\uc9c0\ub9cc, SWIG\ub77c\ub4e0\uac00, \uadf8\ub7f0\uac83\ub4e4\uc740 \ub098\uc5d0\uac8c \ub3c4\uc6c0\uc774 \ub418\uc9c0 \uc54a\uc558\ub2e4. \uadf8\ub798\uc11c ctypes\ub97c \uacf5\ubd80\ud588\ub2e4.<\/p>\n<p>\uc77c\ub2e8 \uc0ac\uc6a9\ud558\uae30 \uc704\ud574\uc11c\ub294 import ctypes\ub85c \ubd88\ub7ec\uc640\uc57c \ud55c\ub2e4. \uadf8\ub7ec\uba74 ctypes\uac00 \uba54\ubaa8\ub9ac\uc5d0 \uc801\uc7ac\ub41c\ub2e4.<\/p>\n<p>\ub2e4\uc74c \uc21c\uc11c\ub294 \ub0b4\uac00 \uc0ac\uc6a9\ud560 DLL\ud30c\uc77c\uc744 \uc54c\ub824\uc8fc\ub294 \uac83\uc774\ub2e4.<\/p>\n<p>myDLL = ctypes.WinDLL(&#8216;myDLLfile&#8217;)<\/p>\n<p>\uc704\uc640 \uac19\uc774 \uc4f0\uba74 \ub41c\ub2e4. \uc774 \ub54c, \uc774\uac78 \uc0ac\uc6a9\ud558\uace0 \uc788\ub294 \ud30c\uc774\uc36c \ud504\ub85c\uadf8\ub7a8 \ud30c\uc77c(.py)\uc758 \uacbd\ub85c\uc5d0\ub294 myDLLfile.dll \ud30c\uc77c\uc774 \uc874\uc7ac\ud574\uc57c \ud55c\ub2e4. \uc774\ub807\uac8c \ud558\uba74 \uc774\uc81c \ud30c\uc774\uc36c\uc740 \ub0b4\uac00 \ubb34\uc2a8 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uac00\uc838\ub2e4 \uc4f0\uace0\uc2f6\uc740\uac74\uc9c0 \uc54c\uac8c \ub418\uc5c8\ub2e4.<\/p>\n<p>\uadf8 \ub2e4\uc74c, DLL\ud30c\uc77c\uc774\ub791 \uac19\uc774 \uc8fc\uc5b4\uc9c4 \ud5e4\ub354 \ud30c\uc77c(.h)\uc744 \uc0b4\ud3b4\ubcf4\uace0\uc11c, DLL\ud30c\uc77c\uc5d0 \uc788\ub294 \uc5ec\ub7ec \ud568\uc218 \uc911 \ubb58 \uac00\uc838\ub2e4 \uc4f8 \uac83\uc778\uc9c0 \uc815\ud574\uc57c \ud55c\ub2e4.<\/p>\n<p>\uc0ac\uc2e4 \ud5e4\ub354\ud30c\uc77c\uc758 \ub0b4\uc6a9\uc744 \ud30c\uc774\uc36c\uc758 \ub0b4\uc6a9\uc73c\ub85c \ubc88\uc5ed\ud558\ub294 \uac83\uacfc \ubcc4\ub2e4\ub978\uac8c \uc5c6\ub294\ub370, C\uc5b8\uc5b4 \ud5e4\ub354\ud30c\uc77c\uc5d0 \uc815\uc758\ub41c \ub0b4\uc6a9\uc740 \ud568\uc218\uc758 \uc774\ub984, \ud568\uc218\uac00 \ubc1b\uc744 \ubcc0\uc218\uc758 \uc218\uc640 \ud615, \ud568\uc218\uac00 \ub418\ub3cc\ub824\uc904 \ubcc0\uc218\uc758 \ud615\uc774 \uc788\ub2e4.<\/p>\n<p>mypythonfunc= myDLL[&#8216;MY_C_FUNC&#8217;]<\/p>\n<p>\uc704\uc640 \uac19\uc740 \ud55c \uc904\uc744 \uc801\uc5b4 \uc918\uc11c, DLL\ud30c\uc77c\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc911 \uc5b4\ub5a4 \ud568\uc218\ub97c \uc4f0\uace0 \uc2f6\uc740\uc9c0 \uc801\uc5b4\uc8fc\uace0, \uadf8 \ud568\uc218\ub97c \ub0b4\uac00 \uc5b4\ub5a4 \uc774\ub984\uc73c\ub85c \uc4f8\uac74\uc9c0 \uc54c\ub824\uc8fc\uba74 \ub41c\ub2e4. \ud558\uc9c0\ub9cc \uc774\uac83\ub9cc\uc73c\ub85c\ub294 \uc800 \ud568\uc218\uc758 \ubaa8\ub4e0 \uac83\uc744 \uc54c\ub824\uc900 \uac83\uc774 \uc544\ub2c8\ub2e4.<br \/>\nmypythonfunc.argtypes = (ctypes.c_int,ctypes.c_double)<\/p>\n<p>\uc704\uc640 \uac19\uc774 argtypes\ub97c \uc9c0\uc815\ud574 \uc8fc\ub294\ub370, \uc774\uac83\uc740 \uc774 \ud568\uc218\uac00 \ubcc0\uc218\ub85c\uc368 \uc5b4\ub5a4 \ud615\uc2dd\uc744 \ubc1b\uc744 \uac74\uc9c0 \uc54c\ub824\uc8fc\ub294 \ubcc0\uc218\uc774\ub2e4. \uadfc\ub370 \ub0b4\uac00\uc798\ubabb \uc0ac\uc6a9\ud55c\uac74\uc9c0\ub294 \ubaa8\ub974\uaca0\uc9c0\ub9cc, \ubcc0\uc218\uc758 \uc218\uac00 1\uac1c\uc77c \ub54c\ub294 \uc5d0\ub7ec\uac00 \ub098\uc11c \uc9c0\uc815\ud574\uc8fc\uc9c0 \uc54a\uc558\ub2e4. \uc9c0\uc815\ud574\uc8fc\uc9c0 \uc54a\ub354\ub77c\ub3c4 \ud5e4\ub354 \ud30c\uc77c\uc5d0 \uc815\uc758\ub41c \ud615\uc73c\ub85c \uc798 \ub118\uc5b4\uac00\uae30\ub9cc \ud55c\ub2e4\uba74 \uc5d0\ub7ec\ub294 \ub098\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n<p>imct_initialize.restype = ctypes.c_int<\/p>\n<p>restype\uc740 \ud568\uc218\uac00 \ub418\ub3cc\ub824\uc8fc\ub294 \uac12\uc758 \ud615, \uc989 \ubc18\ud658\ud615\uc774\ub2e4.<\/p>\n<p>\uc774\ub807\uac8c \ud558\uace0 \ub098\uba74, \uc774\uc81c mypythonfunc(a, b)\ub97c \uac00\uc838\ub2e4 \uc4f0\uae30\ub9cc \ud558\uba74 \ub41c\ub2e4.<\/p>\n<p>\ud558\uc9c0\ub9cc, \ubb38\uc81c\uac00 \uc788\ub2e4. C\uc5b8\uc5b4\uc5d0\ub294 \ud3ec\uc778\ud130\ub77c\ub294 \ub140\uc11d\uc774 \uc788\ub294\ub370, \ud568\uc218\uac00 \ud3ec\uc778\ud130\ub97c \ud1b5\ud574\uc11c \uc790\ub8cc\ub97c \uc8fc\uace0\ubc1b\ub294 \uacbd\uc6b0\uc5d0\ub294 restype\uc744 \uc544\ubb34\ub9ac \uc368\ubd10\uc57c \uc5b4\uca54 \uc218 \uc5c6\ub2e4. \ud3ec\uc778\ud130\ub97c \uc120\uc5b8\ud574\uc918\uc57c \ud55c\ub2e4.<\/p>\n<p>\uc774\ub7f0 \uacbd\uc6b0 argtypes\uc5d0\ub294 ctypes.c_void_p\ub97c \uc4f0\uac70\ub098, ctypes.POINTER(ctypes.c_int)\ub97c\uc4f4\ub2e4. ctypes.POINTER\uc758 \uc548\ucabd\uc5d0 \ub4e4\uc5b4\uac00\ub294 \ubcc0\uc218\ub294 \uc2e4\uc81c \ud3ec\uc778\ud130 \uc120\uc5b8\uc5d0 \uc0ac\uc6a9\ud55c \ubcc0\uc218\uc758 \ud615\uc744 \uc368\uc8fc\uba74 \ub41c\ub2e4.<\/p>\n<p>\uc774\ub807\uac8c \ud558\uace0\uc11c, \ub9cc\uc57d \ub2e4\uc74c\uacfc \uac19\uc774 \uc368\uc838 \uc788\ub2e4\uace0 \ud574 \ubcf4\uc790.<\/p>\n<p>mypythonfunc.argtypes = (ctypes.POINTER(ctypes.c_int),ctypes.c_double)<\/p>\n<p>\uadf8\ub7fc mypythonfunc(a, b)\ucc98\ub7fc \uc0ac\uc6a9\ud560 \ub54c a\uc5d0\ub294 \ud3ec\uc778\ud130 \ubcc0\uc218\ub97c \ub123\uc5b4\uc918\uc57c \ud55c\ub2e4. \ud558\uc9c0\ub9cc \ud30c\uc774\uc36c\uc5d0\ub294 \ud3ec\uc778\ud130\ub77c\ub294 \uac1c\ub150\uc774 \uc5c6\ub2e4. \uadf8\ub798\uc11c \ub9cc\ub4e4\uc5b4 \uc918\uc57c \ud55c\ub2e4.<\/p>\n<p>\uc77c\ub2e8 \ud3ec\uc778\ud130 \ud615\uc774 ctypes.c_int\ub2c8\uae4c x=ctypes.c_int(0) \ucc98\ub7fc \uc120\uc5b8\ud55c\ub2e4. 0\uc740 \ucd08\uae30\uac12\uc774\ub2e4. \uadf8\ub7f0 \ub2e4\uc74c mypythonfunc(ctypes.byref(a), b) \ucc98\ub7fc \uc0ac\uc6a9\ud558\uba74\ub41c\ub2e4. byref\ub294 ctypes\uc5d0\uc11c &#8220;\ucc38\uc870\ud615 \ubcc0\uc218&#8221;\ub85c \uac12\uc744 \uc804\ub2ec\ud558\ub294 \ud568\uc218\uc774\ub2e4. \uc774\ub807\uac8c \ud55c \ud6c4 \ud568\uc218\ub97c \uc2e4\ud589\uc2dc\ud0a4\uba74 a\uc758 \uac12\uc774 \ud568\uc218\uc758 \uc2e4\ud589 \uacb0\uacfc\uc5d0 \ub530\ub77c \ubc14\ub00c\uc5b4 \uc788\uc74c\uc744 \uc54c \uc218 \uc788\ub2e4.<\/p>\n<p>\uc608\ub97c \ub4e4\uc5b4 ctypes.c_int(4)\ub97c 4\uc640 \ube44\uad50\ud558\uace0 \uc2f6\ub2e4\uace0 \ud574 \ubcf4\uc790. \uc774\uac78 ctypes.c_int(4) == 4 \uc774\ub807\uac8c \ube44\uad50\ub97c \ud558\uc790\uace0 \ud558\uba74 False\uac00 \ub730 \uac83\uc774\ub2e4. ctypes.c_int(4).value \ub85c \uadf8 \ub0b4\ubd80\uc758 \uac12\uc744 \ubd88\ub7ec\uc640\uc57c \ud55c\ub2e4. \ub9cc\uc57d m = ctypes.c_int(4)\ub85c \uc120\uc5b8\ub418\uc5b4 \uc788\uc5c8\ub2e4\uba74 m.value\ub97c \uc368\uc918\uc57c \ud30c\uc774\uc36c\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uac12\uc774 \ube60\uc838\ub098\uc628\ub2e4.<\/p>\n<p>\ubc30\uc5f4\uc744 \ud1b5\uc9f8\ub85c \ub118\uae38 \ub54c\ub294 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?<\/p>\n<p>mypythonfunc.argtypes = (ctypes.c_void_p, ctypes.c_double)<\/p>\n<p>\ubc30\uc5f4\uc740 argtypes\uc5d0 \ub4e4\uc5b4\uac00\ub294 \uacbd\uc6b0 ctypes.c_void_p\ub85c \ud615\uc744 \uc9c0\uc815\ud574 \uc8fc\uba74 \ub41c\ub2e4. \uadf8\ub9ac\uace0 \ud30c\uc774\uc36c\uc758 \ubc30\uc5f4\uc744 \ub123\uc5b4\uc8fc\uba74 \ub418\ub294\ub370, \ud30c\uc774\uc36c\uc758 \ubc30\uc5f4\uc774 C\uc758 \ubc30\uc5f4\uacfc \uac19\uc744\ub9ac\uac00 \uc5c6\ub2e4. \uadf8\ub798\uc11c \uc774\ub807\uac8c \ud574\uc918\uc57c \ud55c\ub2e4<\/p>\n<p>myarray = ctypes.c_int * 8<\/p>\n<p>\uc774\ub807\uac8c \ud558\uba74 myarray\ub294 int\ub97c 8\uac1c \uac00\uc9c0\ub294 type\uc774 \ub41c\ub2e4. \uc5ec\uae30\uc11c \uc911\uc694\ud55c\uac74 myarray\ub294 \ubcc0\uc218\uac00 \uc544\ub2c8\ub77c types\uc774\ub77c\ub294 \uac83\uc774\ub2e4. \uadf8 \ub2e4\uc74c \ud568\uc218\uc5d0 \uac12\uc744 \ub123\uc744 \ub54c\ub294<\/p>\n<p>mya = myarray(0,1,2,3,4,5,6,7) \ucc98\ub7fc \ubcc0\uc218\ub97c \ud558\ub098 \uc0c8\ub85c \ub9cc\ub4e4\uc5b4\uc11c<\/p>\n<p>mypythonfunc(mya, b) \ucc98\ub7fc \ud568\uc218\ub97c \ubd88\ub7ec\uc640\uc57c \ud55c\ub2e4. \uc774 \uacbd\uc6b0\uc5d0\ub294 byref\ub97c \uc4f0\uc9c0 \uc54a\uc544\ub3c4 \ucc38\uc870\ud615\uc73c\ub85c \ubcc0\uc218\uac00 \ub118\uc5b4\uac00\uae30 \ub54c\ubb38\uc5d0 mya\ub294 \ud568\uc218\uc758 \uc2e4\ud589 \uacb0\uacfc\uc5d0 \ub530\ub77c \ubc14\ub00c\uac8c \ub41c\ub2e4. \ub9cc\uc57d \uadf8 \uacb0\uacfc\ub85c \ub098\uc628 mya\ub97c \ub2e4\uc2dc \ud30c\uc774\uc36c\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ubc30\uc5f4\ub85c \uace0\uce58\uace0 \uc2f6\ub2e4\uba74 list(mya)\ub97c \uc368\uc11c \ud30c\uc774\uc36c\uc758 \ubc30\uc5f4\ub85c \ubc14\uafd4\uc904 \uc218 \uc788\ub2e4.<\/p>\n<p><a href=\"https:\/\/docs.python.org\/3.6\/library\/ctypes.html\">https:\/\/docs.python.org\/3.6\/library\/ctypes.html<\/a><\/p>\n<p><a href=\"https:\/\/docs.python.org\/2\/library\/ctypes.html\">https:\/\/docs.python.org\/2\/library\/ctypes.html<\/a><\/p>\n<p>\uc704\uc758 \ucc38\uace0\ubb38\ud5cc\uc744 \uc798 \uc77d\uc5b4\ubcf4\uace0 \uc0ac\uc6a9\ud558\ub3c4\ub85d\ud558\uc790.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc0b4\ub2e4\ubcf4\uba74 \ud30c\uc774\uc36c\uc5d0\uc11c C\uc5b8\uc5b4\ub85c \ub9cc\ub4e4\uc5b4\uc9c4 DLL\ud30c\uc77c\uc744 \uc368\uc57c \ud560 \uc77c\uc774 \uc788\uc744 \uc218\ub3c4 \uc788\ub2e4. \uc801\uc5b4\ub3c4 \ub09c \uadf8\ub7ac\ub2e4. \uadf8\ub798\uc11c \uadf8\uac78 \ud558\uae30 \uc704\ud574 \ub9ce\uc740 \ud574\ubc95\ub4e4\uc744 \ucc3e\uc544\ubcf4\uc558\uc9c0\ub9cc, SWIG\ub77c\ub4e0\uac00, \uadf8\ub7f0\uac83\ub4e4\uc740 \ub098\uc5d0\uac8c \ub3c4\uc6c0\uc774 \ub418\uc9c0 \uc54a\uc558\ub2e4. \uadf8\ub798\uc11c ctypes\ub97c \uacf5\ubd80\ud588\ub2e4. \uc77c\ub2e8 \uc0ac\uc6a9\ud558\uae30 \uc704\ud574\uc11c\ub294 import ctypes\ub85c \ubd88\ub7ec\uc640\uc57c \ud55c\ub2e4. \uadf8\ub7ec\uba74 ctypes\uac00 \uba54\ubaa8\ub9ac\uc5d0 \uc801\uc7ac\ub41c\ub2e4. \ub2e4\uc74c \uc21c\uc11c\ub294 \ub0b4\uac00 \uc0ac\uc6a9\ud560 DLL\ud30c\uc77c\uc744 \uc54c\ub824\uc8fc\ub294 \uac83\uc774\ub2e4. myDLL = ctypes.WinDLL(&#8216;myDLLfile&#8217;) \uc704\uc640 \uac19\uc774 \uc4f0\uba74 \ub41c\ub2e4. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[12],"tags":[],"class_list":["post-11286","post","type-post","status-publish","format-standard","hentry","category-12"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8o6gA-2W2","jetpack-related-posts":[],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"http:\/\/melotopia.net\/b\/index.php?rest_route=\/wp\/v2\/posts\/11286","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/melotopia.net\/b\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/melotopia.net\/b\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/melotopia.net\/b\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/melotopia.net\/b\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11286"}],"version-history":[{"count":1,"href":"http:\/\/melotopia.net\/b\/index.php?rest_route=\/wp\/v2\/posts\/11286\/revisions"}],"predecessor-version":[{"id":11287,"href":"http:\/\/melotopia.net\/b\/index.php?rest_route=\/wp\/v2\/posts\/11286\/revisions\/11287"}],"wp:attachment":[{"href":"http:\/\/melotopia.net\/b\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/melotopia.net\/b\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=11286"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/melotopia.net\/b\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=11286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}