-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathctypes.html
More file actions
159 lines (135 loc) · 53.9 KB
/
ctypes.html
File metadata and controls
159 lines (135 loc) · 53.9 KB
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Python - ctypes</title>
<meta name="generator" content="VuePress 1.8.2">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="description" content="ctypes arrays, Wrapping functions for ctypes, Basic usage, Common pitfalls, Basic ctypes object, Complex usage">
<meta property="og:site_name" content="DevTut">
<meta property="og:title" content="Python - ctypes">
<meta property="og:description" content="ctypes arrays, Wrapping functions for ctypes, Basic usage, Common pitfalls, Basic ctypes object, Complex usage">
<meta property="og:type" content="article">
<meta property="og:url" content="/python/ctypes.html">
<meta property="og:image" content="/logo.png">
<meta name="twitter:title" content="Python - ctypes">
<meta name="twitter:description" content="ctypes arrays, Wrapping functions for ctypes, Basic usage, Common pitfalls, Basic ctypes object, Complex usage">
<meta name="twitter:url" content="/python/ctypes.html">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="/logo.png">
<meta name="theme-color" content="#ffffff">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="msapplication-TileImage" content="/mstile-150x150.png">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="google-site-verification" content="76_rKXgwMVIjd-axJC_1zPV9OS4mEjvtgjYOWVkAdnQ">
<link rel="preload" href="/assets/css/0.styles.60619e34.css" as="style"><link rel="preload" href="/assets/js/app.1779e102.js" as="script"><link rel="preload" href="/assets/js/3.2cfa8016.js" as="script"><link rel="preload" href="/assets/js/2683.3cd11093.js" as="script">
<link rel="stylesheet" href="/assets/css/0.styles.60619e34.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">DevTut</span></a> <div class="links"><form id="search-form" role="search" class="algolia-search-wrapper search-box"><input id="algolia-search-input" class="search-query"></form> <nav class="nav-links can-hide"> <a href="https://github.com/devtut/generate" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"> <a href="https://github.com/devtut/generate" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Python</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/python/" aria-current="page" class="sidebar-link">Disclaimer</a></li><li><a href="/python/getting-started-with-python-language.html" class="sidebar-link">Getting started with Python Language</a></li><li><a href="/python/python-data-types.html" class="sidebar-link">Python Data Types</a></li><li><a href="/python/indentation.html" class="sidebar-link">Indentation</a></li><li><a href="/python/comments-and-documentation.html" class="sidebar-link">Comments and Documentation</a></li><li><a href="/python/date-and-time.html" class="sidebar-link">Date and Time</a></li><li><a href="/python/enum.html" class="sidebar-link">Enum</a></li><li><a href="/python/set.html" class="sidebar-link">Set</a></li><li><a href="/python/simple-mathematical-operators.html" class="sidebar-link">Simple Mathematical Operators</a></li><li><a href="/python/bitwise-operators.html" class="sidebar-link">Bitwise Operators</a></li><li><a href="/python/boolean-operators.html" class="sidebar-link">Boolean Operators</a></li><li><a href="/python/operator-precedence.html" class="sidebar-link">Operator Precedence</a></li><li><a href="/python/variable-scope-and-binding.html" class="sidebar-link">Variable Scope and Binding</a></li><li><a href="/python/conditionals.html" class="sidebar-link">Conditionals</a></li><li><a href="/python/comparisons.html" class="sidebar-link">Comparisons</a></li><li><a href="/python/loops.html" class="sidebar-link">Loops</a></li><li><a href="/python/arrays.html" class="sidebar-link">Arrays</a></li><li><a href="/python/multidimensional-arrays.html" class="sidebar-link">Multidimensional arrays</a></li><li><a href="/python/dictionary.html" class="sidebar-link">Dictionary</a></li><li><a href="/python/list.html" class="sidebar-link">List</a></li><li><a href="/python/list-comprehensions.html" class="sidebar-link">List Comprehensions</a></li><li><a href="/python/list-slicing-selecting-parts-of-lists.html" class="sidebar-link">List slicing (selecting parts of lists)</a></li><li><a href="/python/groupby.html" class="sidebar-link">groupby()</a></li><li><a href="/python/linked-lists.html" class="sidebar-link">Linked lists</a></li><li><a href="/python/linked-list-node.html" class="sidebar-link">Linked List Node</a></li><li><a href="/python/filter.html" class="sidebar-link">Filter</a></li><li><a href="/python/heapq.html" class="sidebar-link">Heapq</a></li><li><a href="/python/tuple.html" class="sidebar-link">Tuple</a></li><li><a href="/python/basic-input-and-output.html" class="sidebar-link">Basic Input and Output</a></li><li><a href="/python/files-folders-i-o.html" class="sidebar-link">Files & Folders I/O</a></li><li><a href="/python/os-path.html" class="sidebar-link">os.path</a></li><li><a href="/python/iterables-and-iterators.html" class="sidebar-link">Iterables and Iterators</a></li><li><a href="/python/functions.html" class="sidebar-link">Functions</a></li><li><a href="/python/defining-functions-with-list-arguments.html" class="sidebar-link">Defining functions with list arguments</a></li><li><a href="/python/functional-programming-in-python.html" class="sidebar-link">Functional Programming in Python</a></li><li><a href="/python/partial-functions.html" class="sidebar-link">Partial functions</a></li><li><a href="/python/decorators.html" class="sidebar-link">Decorators</a></li><li><a href="/python/classes.html" class="sidebar-link">Classes</a></li><li><a href="/python/metaclasses.html" class="sidebar-link">Metaclasses</a></li><li><a href="/python/string-formatting.html" class="sidebar-link">String Formatting</a></li><li><a href="/python/string-methods.html" class="sidebar-link">String Methods</a></li><li><a href="/python/using-loops-within-functions.html" class="sidebar-link">Using loops within functions</a></li><li><a href="/python/importing-modules.html" class="sidebar-link">Importing modules</a></li><li><a href="/python/difference-between-module-and-package.html" class="sidebar-link">Difference between Module and Package</a></li><li><a href="/python/math-module.html" class="sidebar-link">Math Module</a></li><li><a href="/python/complex-math.html" class="sidebar-link">Complex math</a></li><li><a href="/python/collections-module.html" class="sidebar-link">Collections module</a></li><li><a href="/python/operator-module.html" class="sidebar-link">Operator module</a></li><li><a href="/python/json-module.html" class="sidebar-link">JSON Module</a></li><li><a href="/python/sqlite3-module.html" class="sidebar-link">Sqlite3 Module</a></li><li><a href="/python/the-os-module.html" class="sidebar-link">The os Module</a></li><li><a href="/python/the-locale-module.html" class="sidebar-link">The locale Module</a></li><li><a href="/python/itertools-module.html" class="sidebar-link">Itertools Module</a></li><li><a href="/python/asyncio-module.html" class="sidebar-link">Asyncio Module</a></li><li><a href="/python/random-module.html" class="sidebar-link">Random module</a></li><li><a href="/python/functools-module.html" class="sidebar-link">Functools Module</a></li><li><a href="/python/the-dis-module.html" class="sidebar-link">The dis module</a></li><li><a href="/python/the-base64-module.html" class="sidebar-link">The base64 Module</a></li><li><a href="/python/queue-module.html" class="sidebar-link">Queue Module</a></li><li><a href="/python/deque-module.html" class="sidebar-link">Deque Module</a></li><li><a href="/python/webbrowser-module.html" class="sidebar-link">Webbrowser Module</a></li><li><a href="/python/tkinter.html" class="sidebar-link">tkinter</a></li><li><a href="/python/pyautogui-module.html" class="sidebar-link">pyautogui module</a></li><li><a href="/python/indexing-and-slicing.html" class="sidebar-link">Indexing and Slicing</a></li><li><a href="/python/plotting-with-matplotlib.html" class="sidebar-link">Plotting with Matplotlib</a></li><li><a href="/python/graph-tool.html" class="sidebar-link">graph-tool</a></li><li><a href="/python/generators.html" class="sidebar-link">Generators</a></li><li><a href="/python/reduce.html" class="sidebar-link">Reduce</a></li><li><a href="/python/map-function.html" class="sidebar-link">Map Function</a></li><li><a href="/python/exponentiation.html" class="sidebar-link">Exponentiation</a></li><li><a href="/python/searching.html" class="sidebar-link">Searching</a></li><li><a href="/python/sorting-minimum-and-maximum.html" class="sidebar-link">Sorting, Minimum and Maximum</a></li><li><a href="/python/counting.html" class="sidebar-link">Counting</a></li><li><a href="/python/the-print-function.html" class="sidebar-link">The Print Function</a></li><li><a href="/python/regular-expressions-regex.html" class="sidebar-link">Regular Expressions (Regex)</a></li><li><a href="/python/copying-data.html" class="sidebar-link">Copying data</a></li><li><a href="/python/context-managers-with-statement.html" class="sidebar-link">Context Managers (“with” Statement)</a></li><li><a href="/python/the-name-special-variable.html" class="sidebar-link">The _name_ special variable</a></li><li><a href="/python/checking-path-existence-and-permissions.html" class="sidebar-link">Checking Path Existence and Permissions</a></li><li><a href="/python/creating-python-packages.html" class="sidebar-link">Creating Python packages</a></li><li><a href="/python/usage-of-pip-module-pypi-package-manager.html" class="sidebar-link">Usage of "pip" module: PyPI Package Manager</a></li><li><a href="/python/pip-pypi-package-manager.html" class="sidebar-link">pip: PyPI Package Manager</a></li><li><a href="/python/parsing-command-line-arguments.html" class="sidebar-link">Parsing Command Line arguments</a></li><li><a href="/python/subprocess-library.html" class="sidebar-link">Subprocess Library</a></li><li><a href="/python/setup-py.html" class="sidebar-link">setup.py</a></li><li><a href="/python/recursion.html" class="sidebar-link">Recursion</a></li><li><a href="/python/type-hints.html" class="sidebar-link">Type Hints</a></li><li><a href="/python/exceptions.html" class="sidebar-link">Exceptions</a></li><li><a href="/python/raise-custom-errors-exceptions.html" class="sidebar-link">Raise Custom Errors / Exceptions</a></li><li><a href="/python/commonwealth-exceptions.html" class="sidebar-link">Commonwealth Exceptions</a></li><li><a href="/python/urllib.html" class="sidebar-link">urllib</a></li><li><a href="/python/web-scraping-with-python.html" class="sidebar-link">Web scraping with Python</a></li><li><a href="/python/html-parsing.html" class="sidebar-link">HTML Parsing</a></li><li><a href="/python/manipulating-xml.html" class="sidebar-link">Manipulating XML</a></li><li><a href="/python/python-requests-post.html" class="sidebar-link">Python Requests Post</a></li><li><a href="/python/distribution.html" class="sidebar-link">Distribution</a></li><li><a href="/python/property-objects.html" class="sidebar-link">Property Objects</a></li><li><a href="/python/overloading.html" class="sidebar-link">Overloading</a></li><li><a href="/python/polymorphism.html" class="sidebar-link">Polymorphism</a></li><li><a href="/python/method-overriding.html" class="sidebar-link">Method Overriding</a></li><li><a href="/python/user-defined-methods.html" class="sidebar-link">User-Defined Methods</a></li><li><a href="/python/string-representations-of-class-instances-str-and-repr-methods.html" class="sidebar-link">String representations of class instances: _str and repr_ methods</a></li><li><a href="/python/debugging.html" class="sidebar-link">Debugging</a></li><li><a href="/python/reading-and-writing-csv.html" class="sidebar-link">Reading and Writing CSV</a></li><li><a href="/python/writing-to-csv-from-string-or-list.html" class="sidebar-link">Writing to CSV from String or List</a></li><li><a href="/python/dynamic-code-execution-with-exec-and-eval.html" class="sidebar-link">Dynamic code execution with exec and eval</a></li><li><a href="/python/pyinstaller-distributing-python-code.html" class="sidebar-link">PyInstaller - Distributing Python Code</a></li><li><a href="/python/data-visualization-with-python.html" class="sidebar-link">Data Visualization with Python</a></li><li><a href="/python/the-interpreter-command-line-console.html" class="sidebar-link">The Interpreter (Command Line Console)</a></li><li><a href="/python/args-and-kwargs.html" class="sidebar-link">args and *kwargs</a></li><li><a href="/python/garbage-collection.html" class="sidebar-link">Garbage Collection</a></li><li><a href="/python/pickle-data-serialisation.html" class="sidebar-link">Pickle data serialisation</a></li><li><a href="/python/binary-data.html" class="sidebar-link">Binary Data</a></li><li><a href="/python/idioms.html" class="sidebar-link">Idioms</a></li><li><a href="/python/data-serialization.html" class="sidebar-link">Data Serialization</a></li><li><a href="/python/multiprocessing.html" class="sidebar-link">Multiprocessing</a></li><li><a href="/python/multithreading.html" class="sidebar-link">Multithreading</a></li><li><a href="/python/processes-and-threads.html" class="sidebar-link">Processes and Threads</a></li><li><a href="/python/python-concurrency.html" class="sidebar-link">Python concurrency</a></li><li><a href="/python/parallel-computation.html" class="sidebar-link">Parallel computation</a></li><li><a href="/python/sockets.html" class="sidebar-link">Sockets</a></li><li><a href="/python/websockets.html" class="sidebar-link">Websockets</a></li><li><a href="/python/sockets-and-message-encryption-decryption-between-client-and-server.html" class="sidebar-link">Sockets And Message Encryption/Decryption Between Client and Server</a></li><li><a href="/python/python-networking.html" class="sidebar-link">Python Networking</a></li><li><a href="/python/python-http-server.html" class="sidebar-link">Python HTTP Server</a></li><li><a href="/python/flask.html" class="sidebar-link">Flask</a></li><li><a href="/python/introduction-to-rabbitmq-using-amqpstorm.html" class="sidebar-link">Introduction to RabbitMQ using AMQPStorm</a></li><li><a href="/python/descriptor.html" class="sidebar-link">Descriptor</a></li><li><a href="/python/tempfile-namedtemporaryfile.html" class="sidebar-link">tempfile NamedTemporaryFile</a></li><li><a href="/python/input-subset-and-output-external-data-files-using-pandas.html" class="sidebar-link">Input, Subset and Output External Data Files using Pandas</a></li><li><a href="/python/unzipping-files.html" class="sidebar-link">Unzipping Files</a></li><li><a href="/python/working-with-zip-archives.html" class="sidebar-link">Working with ZIP archives</a></li><li><a href="/python/getting-start-with-gzip.html" class="sidebar-link">getting start with GZip</a></li><li><a href="/python/stack.html" class="sidebar-link">Stack</a></li><li><a href="/python/working-around-the-global-interpreter-lock-gil.html" class="sidebar-link">Working around the Global Interpreter Lock (GIL)</a></li><li><a href="/python/deployment.html" class="sidebar-link">Deployment</a></li><li><a href="/python/logging.html" class="sidebar-link">Logging</a></li><li><a href="/python/web-server-gateway-interface-wsgi.html" class="sidebar-link">Web Server Gateway Interface (WSGI)</a></li><li><a href="/python/python-server-sent-events.html" class="sidebar-link">Python Server Sent Events</a></li><li><a href="/python/alternatives-to-switch-statement-from-other-languages.html" class="sidebar-link">Alternatives to switch statement from other languages</a></li><li><a href="/python/list-destructuring-aka-packing-and-unpacking.html" class="sidebar-link">List destructuring (aka packing and unpacking)</a></li><li><a href="/python/accessing-python-source-code-and-bytecode.html" class="sidebar-link">Accessing Python source code and bytecode</a></li><li><a href="/python/mixins.html" class="sidebar-link">Mixins</a></li><li><a href="/python/attribute-access.html" class="sidebar-link">Attribute Access</a></li><li><a href="/python/arcpy.html" class="sidebar-link">ArcPy</a></li><li><a href="/python/abstract-base-classes-abc.html" class="sidebar-link">Abstract Base Classes (abc)</a></li><li><a href="/python/plugin-and-extension-classes.html" class="sidebar-link">Plugin and Extension Classes</a></li><li><a href="/python/immutable-datatypes-int-float-str-tuple-and-frozensets.html" class="sidebar-link">Immutable datatypes(int, float, str, tuple and frozensets)</a></li><li><a href="/python/incompatibilities-moving-from-python-2-to-python-3.html" class="sidebar-link">Incompatibilities moving from Python 2 to Python 3</a></li><li><a href="/python/2to3-tool.html" class="sidebar-link">2to3 tool</a></li><li><a href="/python/non-official-python-implementations.html" class="sidebar-link">Non-official Python implementations</a></li><li><a href="/python/abstract-syntax-tree.html" class="sidebar-link">Abstract syntax tree</a></li><li><a href="/python/unicode-and-bytes.html" class="sidebar-link">Unicode and bytes</a></li><li><a href="/python/python-serial-communication-pyserial.html" class="sidebar-link">Python Serial Communication (pyserial)</a></li><li><a href="/python/neo4j-and-cypher-using-py2neo.html" class="sidebar-link">Neo4j and Cypher using Py2Neo</a></li><li><a href="/python/basic-curses-with-python.html" class="sidebar-link">Basic Curses with Python</a></li><li><a href="/python/templates-in-python.html" class="sidebar-link">Templates in python</a></li><li><a href="/python/pillow.html" class="sidebar-link">Pillow</a></li><li><a href="/python/the-pass-statement.html" class="sidebar-link">The pass statement</a></li><li><a href="/python/cli-subcommands-with-precise-help-output.html" class="sidebar-link">CLI subcommands with precise help output</a></li><li><a href="/python/database-access.html" class="sidebar-link">Database Access</a></li><li><a href="/python/connecting-python-to-sql-server.html" class="sidebar-link">Connecting Python to SQL Server</a></li><li><a href="/python/postgresql.html" class="sidebar-link">PostgreSQL</a></li><li><a href="/python/python-and-excel.html" class="sidebar-link">Python and Excel</a></li><li><a href="/python/turtle-graphics.html" class="sidebar-link">Turtle Graphics</a></li><li><a href="/python/python-persistence.html" class="sidebar-link">Python Persistence</a></li><li><a href="/python/design-patterns.html" class="sidebar-link">Design Patterns</a></li><li><a href="/python/hashlib.html" class="sidebar-link">hashlib</a></li><li><a href="/python/creating-a-windows-service-using-python.html" class="sidebar-link">Creating a Windows service using Python</a></li><li><a href="/python/mutable-vs-immutable-and-hashable-in-python.html" class="sidebar-link">Mutable vs Immutable (and Hashable) in Python</a></li><li><a href="/python/configparser.html" class="sidebar-link">configparser</a></li><li><a href="/python/optical-character-recognition.html" class="sidebar-link">Optical Character Recognition</a></li><li><a href="/python/virtual-environments.html" class="sidebar-link">Virtual environments</a></li><li><a href="/python/python-virtual-environment-virtualenv.html" class="sidebar-link">Python Virtual Environment - virtualenv</a></li><li><a href="/python/virtual-environment-with-virtualenvwrapper.html" class="sidebar-link">virtual environment with virtualenvwrapper</a></li><li><a href="/python/create-virtual-environment-with-virtualenvwrapper-in-windows.html" class="sidebar-link">Create virtual environment with virtualenvwrapper in windows</a></li><li><a href="/python/sys.html" class="sidebar-link">sys</a></li><li><a href="/python/chempy-python-package.html" class="sidebar-link">ChemPy - python package</a></li><li><a href="/python/pygame.html" class="sidebar-link">pygame</a></li><li><a href="/python/pyglet.html" class="sidebar-link">Pyglet</a></li><li><a href="/python/audio.html" class="sidebar-link">Audio</a></li><li><a href="/python/pyaudio.html" class="sidebar-link">pyaudio</a></li><li><a href="/python/shelve.html" class="sidebar-link">shelve</a></li><li><a href="/python/iot-programming-with-python-and-raspberry-pi.html" class="sidebar-link">IoT Programming with Python and Raspberry PI</a></li><li><a href="/python/kivy-cross-platform-python-framework-for-nui-development.html" class="sidebar-link">kivy - Cross-platform Python Framework for NUI Development</a></li><li><a href="/python/pandas-transform-preform-operations-on-groups-and-concatenate-the-results.html" class="sidebar-link">Pandas Transform: Preform operations on groups and concatenate the results</a></li><li><a href="/python/similarities-in-syntax-differences-in-meaning-python-vs-javascript.html" class="sidebar-link">Similarities in syntax, Differences in meaning: Python vs. JavaScript</a></li><li><a href="/python/call-python-from-c.html" class="sidebar-link">Call Python from C#</a></li><li><a href="/python/ctypes.html" aria-current="page" class="active sidebar-link">ctypes</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/python/ctypes.html#ctypes-arrays" class="sidebar-link">ctypes arrays</a></li><li class="sidebar-sub-header"><a href="/python/ctypes.html#wrapping-functions-for-ctypes" class="sidebar-link">Wrapping functions for ctypes</a></li><li class="sidebar-sub-header"><a href="/python/ctypes.html#basic-usage" class="sidebar-link">Basic usage</a></li><li class="sidebar-sub-header"><a href="/python/ctypes.html#common-pitfalls" class="sidebar-link">Common pitfalls</a></li><li class="sidebar-sub-header"><a href="/python/ctypes.html#basic-ctypes-object" class="sidebar-link">Basic ctypes object</a></li><li class="sidebar-sub-header"><a href="/python/ctypes.html#complex-usage" class="sidebar-link">Complex usage</a></li></ul></li><li><a href="/python/writing-extensions.html" class="sidebar-link">Writing extensions</a></li><li><a href="/python/python-lex-yacc.html" class="sidebar-link">Python Lex-Yacc</a></li><li><a href="/python/unit-testing.html" class="sidebar-link">Unit Testing</a></li><li><a href="/python/py-test.html" class="sidebar-link">py.test</a></li><li><a href="/python/profiling.html" class="sidebar-link">Profiling</a></li><li><a href="/python/python-speed-of-program.html" class="sidebar-link">Python speed of program</a></li><li><a href="/python/performance-optimization.html" class="sidebar-link">Performance optimization</a></li><li><a href="/python/security-and-cryptography.html" class="sidebar-link">Security and Cryptography</a></li><li><a href="/python/secure-shell-connection-in-python.html" class="sidebar-link">Secure Shell Connection in Python</a></li><li><a href="/python/python-anti-patterns.html" class="sidebar-link">Python Anti-Patterns</a></li><li><a href="/python/common-pitfalls.html" class="sidebar-link">Common Pitfalls</a></li><li><a href="/python/hidden-features.html" class="sidebar-link">Hidden Features</a></li><li><a href="/python/date-formatting.html" class="sidebar-link">Date Formatting</a></li><li><a href="/python/ijson.html" class="sidebar-link">ijson</a></li><li><a href="/python/django.html" class="sidebar-link">Django</a></li><li><a href="/python/code-blocks-execution-frames-and-namespaces.html" class="sidebar-link">Code blocks, execution frames, and namespaces</a></li><li><a href="/python/contributors.html" class="sidebar-link">The Contributors</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="ctypes"><a href="#ctypes" class="header-anchor">#</a> ctypes</h1> <p><code>ctypes</code> is a python built-in library that invokes exported functions from native compiled libraries.</p> <p><strong>Note:</strong> Since this library handles compiled code, it is relatively OS dependent.</p> <h2 id="ctypes-arrays"><a href="#ctypes-arrays" class="header-anchor">#</a> ctypes arrays</h2> <p>As any good C programmer knows, a single value won't get you that far. What will really get us going are arrays!</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> c_int <span class="token operator">*</span> <span class="token number">16</span>
<span class="token operator"><</span><span class="token keyword">class</span> <span class="token string">'__main__.c_long_Array_16'</span><span class="token operator">></span>
</code></pre></div><p>This is not an actual array, but it's pretty darn close! We created a class that denotes an array of 16 <code>int</code>s.</p> <p>Now all we need to do is to initialize it:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> arr <span class="token operator">=</span> <span class="token punctuation">(</span>c_int <span class="token operator">*</span> <span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token operator">>></span><span class="token operator">></span> arr
<span class="token operator"><</span>__main__<span class="token punctuation">.</span>c_long_Array_16 <span class="token builtin">object</span> at <span class="token number">0xbaddcafe</span><span class="token operator">></span>
</code></pre></div><p>Now <code>arr</code> is an actual array that contains the numbers from 0 to 15.</p> <p>They can be accessed just like any list:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> arr<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span>
<span class="token number">5</span>
<span class="token operator">>></span><span class="token operator">></span> arr<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">20</span>
<span class="token operator">>></span><span class="token operator">></span> arr<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span>
<span class="token number">20</span>
</code></pre></div><p>And just like any other <code>ctypes</code> object, it also has a size and a location:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> sizeof<span class="token punctuation">(</span>arr<span class="token punctuation">)</span>
<span class="token number">64</span> <span class="token comment"># sizeof(c_int) * 16</span>
<span class="token operator">>></span><span class="token operator">></span> <span class="token builtin">hex</span><span class="token punctuation">(</span>addressof<span class="token punctuation">(</span>arr<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token string">'0xc000l0ff'</span>
</code></pre></div><h2 id="wrapping-functions-for-ctypes"><a href="#wrapping-functions-for-ctypes" class="header-anchor">#</a> Wrapping functions for ctypes</h2> <p>In some cases, a C function accepts a function pointer. As avid <code>ctypes</code> users, we would like to use those functions, and even pass python function as arguments.</p> <p>Let's define a function:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> <span class="token keyword">def</span> <span class="token function">max</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> y<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> x <span class="token keyword">if</span> x <span class="token operator">>=</span> y <span class="token keyword">else</span> y
</code></pre></div><p>Now, that function takes two arguments and returns a result of the same type. For the sake of the example, let's assume that type is an int.</p> <p>Like we did on the array example, we can define an object that denotes that prototype:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> CFUNCTYPE<span class="token punctuation">(</span>c_int<span class="token punctuation">,</span> c_int<span class="token punctuation">,</span> c_int<span class="token punctuation">)</span>
<span class="token operator"><</span>CFunctionType <span class="token builtin">object</span> at <span class="token number">0xdeadbeef</span><span class="token operator">></span>
</code></pre></div><p>That prototype denotes a function that returns an <code>c_int</code> (the first argument), and accepts two <code>c_int</code> arguments (the other arguments).</p> <p>Now let's wrap the function:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> CFUNCTYPE<span class="token punctuation">(</span>c_int<span class="token punctuation">,</span> c_int<span class="token punctuation">,</span> c_int<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token builtin">max</span><span class="token punctuation">)</span>
<span class="token operator"><</span>CFunctionType <span class="token builtin">object</span> at <span class="token number">0xdeadbeef</span><span class="token operator">></span>
</code></pre></div><p>Function prototypes have on more usage: They can wrap <code>ctypes</code> function (like <code>libc.ntohl</code>) and verify that the correct arguments are used when invoking the function.</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> libc<span class="token punctuation">.</span>ntohl<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># garbage in - garbage out</span>
<span class="token operator">>></span><span class="token operator">></span> CFUNCTYPE<span class="token punctuation">(</span>c_int<span class="token punctuation">,</span> c_int<span class="token punctuation">)</span><span class="token punctuation">(</span>libc<span class="token punctuation">.</span>ntohl<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
Traceback <span class="token punctuation">(</span>most recent call last<span class="token punctuation">)</span><span class="token punctuation">:</span>
File <span class="token string">"<stdin>"</span><span class="token punctuation">,</span> line <span class="token number">1</span><span class="token punctuation">,</span> <span class="token keyword">in</span> <span class="token operator"><</span>module<span class="token operator">></span>
TypeError<span class="token punctuation">:</span> this function takes at least <span class="token number">1</span> argument <span class="token punctuation">(</span><span class="token number">0</span> given<span class="token punctuation">)</span>
</code></pre></div><h2 id="basic-usage"><a href="#basic-usage" class="header-anchor">#</a> Basic usage</h2> <p>Let's say we want to use <code>libc</code>'s <code>ntohl</code> function.</p> <p>First, we must load <code>libc.so</code>:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> <span class="token keyword">from</span> ctypes <span class="token keyword">import</span> <span class="token operator">*</span>
<span class="token operator">>></span><span class="token operator">></span> libc <span class="token operator">=</span> cdll<span class="token punctuation">.</span>LoadLibrary<span class="token punctuation">(</span><span class="token string">'libc.so.6'</span><span class="token punctuation">)</span>
<span class="token operator">>></span><span class="token operator">></span> libc
<span class="token operator"><</span>CDLL <span class="token string">'libc.so.6'</span><span class="token punctuation">,</span> handle baadf00d at <span class="token number">0xdeadbeef</span><span class="token operator">></span>
</code></pre></div><p>Then, we get the function object:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> ntohl <span class="token operator">=</span> libc<span class="token punctuation">.</span>ntohl
<span class="token operator">>></span><span class="token operator">></span> ntohl
<span class="token operator"><</span>_FuncPtr <span class="token builtin">object</span> at <span class="token number">0xbaadf00d</span><span class="token operator">></span>
</code></pre></div><p>And now, we can simply invoke the function:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> ntohl<span class="token punctuation">(</span><span class="token number">0x6C</span><span class="token punctuation">)</span>
<span class="token number">1811939328</span>
<span class="token operator">>></span><span class="token operator">></span> <span class="token builtin">hex</span><span class="token punctuation">(</span>_<span class="token punctuation">)</span>
<span class="token string">'0x6c000000'</span>
</code></pre></div><p>Which does exactly what we expect it to do.</p> <h2 id="common-pitfalls"><a href="#common-pitfalls" class="header-anchor">#</a> Common pitfalls</h2> <h3 id="failing-to-load-a-file"><a href="#failing-to-load-a-file" class="header-anchor">#</a> Failing to load a file</h3> <p>The first possible error is failing to load the library. In that case an OSError is usually raised.</p> <p>This is either because the file doesn't exists (or can't be found by the OS):</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> cdll<span class="token punctuation">.</span>LoadLibrary<span class="token punctuation">(</span><span class="token string">"foobar.so"</span><span class="token punctuation">)</span>
Traceback <span class="token punctuation">(</span>most recent call last<span class="token punctuation">)</span><span class="token punctuation">:</span>
File <span class="token string">"<stdin>"</span><span class="token punctuation">,</span> line <span class="token number">1</span><span class="token punctuation">,</span> <span class="token keyword">in</span> <span class="token operator"><</span>module<span class="token operator">></span>
File <span class="token string">"/usr/lib/python3.5/ctypes/__init__.py"</span><span class="token punctuation">,</span> line <span class="token number">425</span><span class="token punctuation">,</span> <span class="token keyword">in</span> LoadLibrary
<span class="token keyword">return</span> self<span class="token punctuation">.</span>_dlltype<span class="token punctuation">(</span>name<span class="token punctuation">)</span>
File <span class="token string">"/usr/lib/python3.5/ctypes/__init__.py"</span><span class="token punctuation">,</span> line <span class="token number">347</span><span class="token punctuation">,</span> <span class="token keyword">in</span> __init__
self<span class="token punctuation">.</span>_handle <span class="token operator">=</span> _dlopen<span class="token punctuation">(</span>self<span class="token punctuation">.</span>_name<span class="token punctuation">,</span> mode<span class="token punctuation">)</span>
OSError<span class="token punctuation">:</span> foobar<span class="token punctuation">.</span>so<span class="token punctuation">:</span> cannot <span class="token builtin">open</span> shared <span class="token builtin">object</span> <span class="token builtin">file</span><span class="token punctuation">:</span> No such <span class="token builtin">file</span> <span class="token keyword">or</span> directory
</code></pre></div><p>As you can see, the error is clear and pretty indicative.</p> <p>The second reason is that the file is found, but is not of the correct format.</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> cdll<span class="token punctuation">.</span>LoadLibrary<span class="token punctuation">(</span><span class="token string">"libc.so"</span><span class="token punctuation">)</span>
Traceback <span class="token punctuation">(</span>most recent call last<span class="token punctuation">)</span><span class="token punctuation">:</span>
File <span class="token string">"<stdin>"</span><span class="token punctuation">,</span> line <span class="token number">1</span><span class="token punctuation">,</span> <span class="token keyword">in</span> <span class="token operator"><</span>module<span class="token operator">></span>
File <span class="token string">"/usr/lib/python3.5/ctypes/__init__.py"</span><span class="token punctuation">,</span> line <span class="token number">425</span><span class="token punctuation">,</span> <span class="token keyword">in</span> LoadLibrary
<span class="token keyword">return</span> self<span class="token punctuation">.</span>_dlltype<span class="token punctuation">(</span>name<span class="token punctuation">)</span>
File <span class="token string">"/usr/lib/python3.5/ctypes/__init__.py"</span><span class="token punctuation">,</span> line <span class="token number">347</span><span class="token punctuation">,</span> <span class="token keyword">in</span> __init__
self<span class="token punctuation">.</span>_handle <span class="token operator">=</span> _dlopen<span class="token punctuation">(</span>self<span class="token punctuation">.</span>_name<span class="token punctuation">,</span> mode<span class="token punctuation">)</span>
OSError<span class="token punctuation">:</span> <span class="token operator">/</span>usr<span class="token operator">/</span>lib<span class="token operator">/</span>i386<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libc<span class="token punctuation">.</span>so<span class="token punctuation">:</span> invalid ELF header
</code></pre></div><p>In this case, the file is a script file and not a <code>.so</code> file. This might also happen when trying to open a <code>.dll</code> file on a Linux machine or a 64bit file on a 32bit python interpreter. As you can see, in this case the error is a bit more vague, and requires some digging around.</p> <h3 id="failing-to-access-a-function"><a href="#failing-to-access-a-function" class="header-anchor">#</a> Failing to access a function</h3> <p>Assuming we successfully loaded the <code>.so</code> file, we then need to access our function like we've done on the first example.</p> <p>When a non-existing function is used, an <code>AttributeError</code> is raised:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> libc<span class="token punctuation">.</span>foo
Traceback <span class="token punctuation">(</span>most recent call last<span class="token punctuation">)</span><span class="token punctuation">:</span>
File <span class="token string">"<stdin>"</span><span class="token punctuation">,</span> line <span class="token number">1</span><span class="token punctuation">,</span> <span class="token keyword">in</span> <span class="token operator"><</span>module<span class="token operator">></span>
File <span class="token string">"/usr/lib/python3.5/ctypes/__init__.py"</span><span class="token punctuation">,</span> line <span class="token number">360</span><span class="token punctuation">,</span> <span class="token keyword">in</span> __getattr__
func <span class="token operator">=</span> self<span class="token punctuation">.</span>__getitem__<span class="token punctuation">(</span>name<span class="token punctuation">)</span>
File <span class="token string">"/usr/lib/python3.5/ctypes/__init__.py"</span><span class="token punctuation">,</span> line <span class="token number">365</span><span class="token punctuation">,</span> <span class="token keyword">in</span> __getitem__
func <span class="token operator">=</span> self<span class="token punctuation">.</span>_FuncPtr<span class="token punctuation">(</span><span class="token punctuation">(</span>name_or_ordinal<span class="token punctuation">,</span> self<span class="token punctuation">)</span><span class="token punctuation">)</span>
AttributeError<span class="token punctuation">:</span> <span class="token operator">/</span>lib<span class="token operator">/</span>i386<span class="token operator">-</span>linux<span class="token operator">-</span>gnu<span class="token operator">/</span>libc<span class="token punctuation">.</span>so<span class="token punctuation">.</span><span class="token number">6</span><span class="token punctuation">:</span> undefined symbol<span class="token punctuation">:</span> foo
</code></pre></div><h2 id="basic-ctypes-object"><a href="#basic-ctypes-object" class="header-anchor">#</a> Basic ctypes object</h2> <p>The most basic object is an int:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> obj <span class="token operator">=</span> ctypes<span class="token punctuation">.</span>c_int<span class="token punctuation">(</span><span class="token number">12</span><span class="token punctuation">)</span>
<span class="token operator">>></span><span class="token operator">></span> obj
c_long<span class="token punctuation">(</span><span class="token number">12</span><span class="token punctuation">)</span>
</code></pre></div><p>Now, <code>obj</code> refers to a chunk of memory containing the value 12.</p> <p>That value can be accessed directly, and even modified:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> obj<span class="token punctuation">.</span>value
<span class="token number">12</span>
<span class="token operator">>></span><span class="token operator">></span> obj<span class="token punctuation">.</span>value <span class="token operator">=</span> <span class="token number">13</span>
<span class="token operator">>></span><span class="token operator">></span> obj
c_long<span class="token punctuation">(</span><span class="token number">13</span><span class="token punctuation">)</span>
</code></pre></div><p>Since <code>obj</code> refers to a chunk of memory, we can also find out it's size and location:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> sizeof<span class="token punctuation">(</span>obj<span class="token punctuation">)</span>
<span class="token number">4</span>
<span class="token operator">>></span><span class="token operator">></span> <span class="token builtin">hex</span><span class="token punctuation">(</span>addressof<span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token string">'0xdeadbeef'</span>
</code></pre></div><h2 id="complex-usage"><a href="#complex-usage" class="header-anchor">#</a> Complex usage</h2> <p>Let's combine all of the examples above into one complex scenario: using <code>libc</code>'s <code>lfind</code> function.</p> <p>For more details about the function, read <a href="https://linux.die.net/man/3/lfind" target="_blank" rel="noopener noreferrer">the man page<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>. I urge you to read it before going on.</p> <p>First, we'll define the proper prototypes:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> compar_proto <span class="token operator">=</span> CFUNCTYPE<span class="token punctuation">(</span>c_int<span class="token punctuation">,</span> POINTER<span class="token punctuation">(</span>c_int<span class="token punctuation">)</span><span class="token punctuation">,</span> POINTER<span class="token punctuation">(</span>c_int<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token operator">>></span><span class="token operator">></span> lfind_proto <span class="token operator">=</span> CFUNCTYPE<span class="token punctuation">(</span>c_void_p<span class="token punctuation">,</span> c_void_p<span class="token punctuation">,</span> c_void_p<span class="token punctuation">,</span> POINTER<span class="token punctuation">(</span>c_uint<span class="token punctuation">)</span><span class="token punctuation">,</span> c_uint<span class="token punctuation">,</span> compar_proto<span class="token punctuation">)</span>
</code></pre></div><p>Then, let's create the variables:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> key <span class="token operator">=</span> c_int<span class="token punctuation">(</span><span class="token number">12</span><span class="token punctuation">)</span>
<span class="token operator">>></span><span class="token operator">></span> arr <span class="token operator">=</span> <span class="token punctuation">(</span>c_int <span class="token operator">*</span> <span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token operator">>></span><span class="token operator">></span> nmemb <span class="token operator">=</span> c_uint<span class="token punctuation">(</span><span class="token number">16</span><span class="token punctuation">)</span>
</code></pre></div><p>And now we define the comparison function:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> <span class="token keyword">def</span> <span class="token function">compar</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> y<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> x<span class="token punctuation">.</span>contents<span class="token punctuation">.</span>value <span class="token operator">-</span> y<span class="token punctuation">.</span>contents<span class="token punctuation">.</span>value
</code></pre></div><p>Notice that <code>x</code>, and <code>y</code> are <code>POINTER(c_int)</code>, so we need to dereference them and take their values in order to actually compare the value stored in the memory.</p> <p>Now we can combine everything together:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> lfind <span class="token operator">=</span> lfind_proto<span class="token punctuation">(</span>libc<span class="token punctuation">.</span>lfind<span class="token punctuation">)</span>
<span class="token operator">>></span><span class="token operator">></span> ptr <span class="token operator">=</span> lfind<span class="token punctuation">(</span>byref<span class="token punctuation">(</span>key<span class="token punctuation">)</span><span class="token punctuation">,</span> byref<span class="token punctuation">(</span>arr<span class="token punctuation">)</span><span class="token punctuation">,</span> byref<span class="token punctuation">(</span>nmemb<span class="token punctuation">)</span><span class="token punctuation">,</span> sizeof<span class="token punctuation">(</span>c_int<span class="token punctuation">)</span><span class="token punctuation">,</span> compar_proto<span class="token punctuation">(</span>compar<span class="token punctuation">)</span><span class="token punctuation">)</span>
</code></pre></div><p><code>ptr</code> is the returned void pointer. If <code>key</code> wasn't found in <code>arr</code>, the value would be <code>None</code>, but in this case we got a valid value.</p> <p>Now we can convert it and access the value:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> cast<span class="token punctuation">(</span>ptr<span class="token punctuation">,</span> POINTER<span class="token punctuation">(</span>c_int<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>contents
c_long<span class="token punctuation">(</span><span class="token number">12</span><span class="token punctuation">)</span>
</code></pre></div><p>Also, we can see that <code>ptr</code> points to the correct value inside <code>arr</code>:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token operator">>></span><span class="token operator">></span> addressof<span class="token punctuation">(</span>arr<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">12</span> <span class="token operator">*</span> sizeof<span class="token punctuation">(</span>c_int<span class="token punctuation">)</span> <span class="token operator">==</span> ptr
<span class="token boolean">True</span>
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/devtut/generate/edit/master/docs/python/ctypes.md" target="_blank" rel="noopener noreferrer">Edit this page on GitHub</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
←
<a href="/python/call-python-from-c.html" class="prev">
Call Python from C#
</a></span> <span class="next"><a href="/python/writing-extensions.html">
Writing extensions
</a>
→
</span></p></div> </main></div><div class="global-ui"><!----></div></div>
<script src="/assets/js/app.1779e102.js" defer></script><script src="/assets/js/3.2cfa8016.js" defer></script><script src="/assets/js/2683.3cd11093.js" defer></script>
</body>
</html>