diff --git a/lib/py/test/fuzz/README.md b/lib/py/test/fuzz/README.md
new file mode 100644
index 0000000..10e76e6
--- /dev/null
+++ b/lib/py/test/fuzz/README.md
@@ -0,0 +1,22 @@
+# Python Fuzzing README
+
+The Python Thrift implementation uses Atheris for fuzzing. Atheris is a coverage-guided, in-process fuzzer for Python that integrates with libFuzzer.
+
+Unlike the C++ implementation, the Python fuzzers are not directly runnable in a local environment. Instead, Atheris generates Python programs that need to be executed through the appropriate build system.
+
+We currently have several fuzz targets that test different aspects of the Thrift implementation:
+
+* FuzzParseBinary -- fuzzes the deserialization of the Binary protocol
+* FuzzParseBinaryAccelerated -- fuzzes the deserialization of the accelerated Binary protocol
+* FuzzParseCompact -- fuzzes the deserialization of the Compact protocol
+* FuzzParseCompactAccelerated -- fuzzes the deserialization of the accelerated Compact protocol
+* FuzzRoundtripBinary -- fuzzes the roundtrip of the Binary protocol (i.e. serializes then deserializes and compares the result)
+* FuzzRoundtripBinaryAccelerated -- fuzzes the roundtrip of the accelerated Binary protocol
+* FuzzRoundtripCompact -- fuzzes the roundtrip of the Compact protocol
+* FuzzRoundtripCompactAccelerated -- fuzzes the roundtrip of the accelerated Compact protocol
+
+The fuzzers use Atheris's mutation engine to generate test cases. Each fuzzer implements the standard Atheris interface and uses common testing code from the fuzz test utilities in `fuzz_common.py`.
+
+For more information about Atheris and its options, see the [Atheris documentation](https://github.com/google/atheris).
+
+You can also use the corpus generator from the Rust implementation to generate initial corpus files that can be used with these Python fuzzers, since the wire formats are identical between implementations.
diff --git a/lib/py/test/fuzz/fuzz_common.py b/lib/py/test/fuzz/fuzz_common.py
new file mode 100644
index 0000000..f472047
--- /dev/null
+++ b/lib/py/test/fuzz/fuzz_common.py
@@ -0,0 +1,134 @@
+import glob
+import sys
+import os
+import atheris
+
+def setup_thrift_imports():
+    """Set up the Python path to include Thrift libraries and generated code."""
+
+    # For oss-fuzz, we need to package it using pyinstaller and set up paths properly
+    if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
+        print('running in a PyInstaller bundle')
+        sys.path.insert(0, "thrift_lib")
+        sys.path.insert(0, "gen-py")
+    else:
+        print('running in a normal Python process')
+        SCRIPT_DIR = os.path.realpath(os.path.dirname(__file__))
+        ROOT_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(SCRIPT_DIR))))
+
+        for libpath in glob.glob(os.path.join(ROOT_DIR, 'lib', 'py', 'build', 'lib.*')):
+            for pattern in ('-%d.%d', '-%d%d'):
+                postfix = pattern % (sys.version_info[0], sys.version_info[1])
+                if libpath.endswith(postfix):
+                    sys.path.insert(0, libpath)
+                    break
+
+        gen_path = os.path.join(
+            os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "..", "gen-py"
+        )
+        sys.path.append(gen_path)
+    print(sys.path)
+
+setup_thrift_imports()
+
+from thrift.transport import TTransport
+from thrift.TSerialization import serialize, deserialize
+from fuzz.ttypes import FuzzTest
+
+def create_parser_fuzzer(protocol_factory_class):
+    """
+    Create a parser fuzzer function for a specific protocol.
+    
+    Args:
+        protocol_factory_class: The Thrift protocol factory class to use
+    
+    Returns:
+        A function that can be used with atheris.Setup()
+    """
+    def TestOneInput(data):
+        if len(data) < 2:
+            return
+
+        try:
+            # Create a memory buffer with the fuzzed data
+            buf = TTransport.TMemoryBuffer(data)
+            transport = TTransport.TBufferedTransportFactory().getTransport(buf)
+            factory = protocol_factory_class(string_length_limit=1000, container_length_limit=1000)
+
+            # Try to deserialize the fuzzed data into the test class
+            test_instance = deserialize(FuzzTest(), data, factory)
+
+        except Exception as e:
+            # We expect various exceptions during fuzzing
+            pass
+
+    return TestOneInput
+
+def create_roundtrip_fuzzer(protocol_factory_class):
+    """
+    Create a roundtrip fuzzer function for a specific protocol.
+    
+    Args:
+        protocol_factory_class: The Thrift protocol factory class to use
+    
+    Returns:
+        A function that can be used with atheris.Setup()
+    """
+    def TestOneInput(data):
+        if len(data) < 2:
+            return
+
+        try:
+            # Create a memory buffer with the fuzzed data
+            buf = TTransport.TMemoryBuffer(data)
+            transport = TTransport.TBufferedTransportFactory().getTransport(buf)
+            factory = protocol_factory_class(string_length_limit=1000, container_length_limit=1000)
+
+            # Try to deserialize the fuzzed data into the test class
+            test_instance = deserialize(FuzzTest(), data, factory)
+            # If deserialization succeeds, try to serialize it back
+            serialized = serialize(test_instance, factory)
+            # Deserialize again
+            deserialized = deserialize(FuzzTest(), serialized, factory)
+            # Verify the objects are equal after a second deserialization
+            assert test_instance == deserialized
+
+        except AssertionError as e:
+            raise e
+        except Exception as e:
+            # We expect various exceptions during fuzzing
+            pass
+
+    return TestOneInput
+
+def _run_fuzzer(fuzzer_function):
+    """
+    Set up and run the fuzzer for a specific protocol.
+    
+    Args:
+        fuzzer_function: The fuzzer function to use
+    """
+    setup_thrift_imports()
+    atheris.instrument_all()
+    atheris.Setup(sys.argv, fuzzer_function, enable_python_coverage=True)
+    atheris.Fuzz()
+
+
+def run_roundtrip_fuzzer(protocol_factory_class):
+    """
+    Set up and run the fuzzer for a specific protocol.
+    
+    Args:
+        protocol_factory_class: The Thrift protocol factory class to use
+    """
+    _run_fuzzer(create_roundtrip_fuzzer(protocol_factory_class))
+
+
+def run_parser_fuzzer(protocol_factory_class):
+    """
+    Set up and run the fuzzer for a specific protocol.
+    
+    Args:
+        protocol_factory_class: The Thrift protocol factory class to use
+    """
+    _run_fuzzer(create_parser_fuzzer(protocol_factory_class))
\ No newline at end of file
diff --git a/lib/py/test/fuzz/fuzz_parse_TBinaryProtocol.py b/lib/py/test/fuzz/fuzz_parse_TBinaryProtocol.py
new file mode 100644
index 0000000..a07de28
--- /dev/null
+++ b/lib/py/test/fuzz/fuzz_parse_TBinaryProtocol.py
@@ -0,0 +1,27 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+from fuzz_common import run_parser_fuzzer
+from thrift.protocol.TBinaryProtocol import TBinaryProtocolFactory
+
+def main():
+    run_parser_fuzzer(TBinaryProtocolFactory)
+
+if __name__ == "__main__":
+    main()
diff --git a/lib/py/test/fuzz/fuzz_parse_TBinaryProtocolAccelerated.py b/lib/py/test/fuzz/fuzz_parse_TBinaryProtocolAccelerated.py
new file mode 100644
index 0000000..7c4f046
--- /dev/null
+++ b/lib/py/test/fuzz/fuzz_parse_TBinaryProtocolAccelerated.py
@@ -0,0 +1,27 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+from fuzz_common import run_parser_fuzzer
+from thrift.protocol.TBinaryProtocol import TBinaryProtocolAcceleratedFactory
+
+def main():
+    run_parser_fuzzer(TBinaryProtocolAcceleratedFactory)
+
+if __name__ == "__main__":
+    main() 
\ No newline at end of file
diff --git a/lib/py/test/fuzz/fuzz_parse_TCompactProtocol.py b/lib/py/test/fuzz/fuzz_parse_TCompactProtocol.py
new file mode 100644
index 0000000..ff05ec1
--- /dev/null
+++ b/lib/py/test/fuzz/fuzz_parse_TCompactProtocol.py
@@ -0,0 +1,27 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+from fuzz_common import run_parser_fuzzer
+from thrift.protocol.TCompactProtocol import TCompactProtocolFactory
+
+def main():
+    run_parser_fuzzer(TCompactProtocolFactory)
+
+if __name__ == "__main__":
+    main() 
\ No newline at end of file
diff --git a/lib/py/test/fuzz/fuzz_parse_TCompactProtocolAccelerated.py b/lib/py/test/fuzz/fuzz_parse_TCompactProtocolAccelerated.py
new file mode 100644
index 0000000..04ab96f
--- /dev/null
+++ b/lib/py/test/fuzz/fuzz_parse_TCompactProtocolAccelerated.py
@@ -0,0 +1,27 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+from fuzz_common import run_parser_fuzzer
+from thrift.protocol.TCompactProtocol import TCompactProtocolAcceleratedFactory
+
+def main():
+    run_parser_fuzzer(TCompactProtocolAcceleratedFactory)
+
+if __name__ == "__main__":
+    main() 
\ No newline at end of file
diff --git a/lib/py/test/fuzz/fuzz_roundtrip_TBinaryProtocol.py b/lib/py/test/fuzz/fuzz_roundtrip_TBinaryProtocol.py
new file mode 100644
index 0000000..7413707
--- /dev/null
+++ b/lib/py/test/fuzz/fuzz_roundtrip_TBinaryProtocol.py
@@ -0,0 +1,27 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+from fuzz_common import run_roundtrip_fuzzer
+from thrift.protocol.TBinaryProtocol import TBinaryProtocolFactory
+
+def main():
+    run_roundtrip_fuzzer(TBinaryProtocolFactory)
+
+if __name__ == "__main__":
+    main()
diff --git a/lib/py/test/fuzz/fuzz_roundtrip_TBinaryProtocolAccelerated.py b/lib/py/test/fuzz/fuzz_roundtrip_TBinaryProtocolAccelerated.py
new file mode 100644
index 0000000..76f3114
--- /dev/null
+++ b/lib/py/test/fuzz/fuzz_roundtrip_TBinaryProtocolAccelerated.py
@@ -0,0 +1,27 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+from fuzz_common import run_roundtrip_fuzzer
+from thrift.protocol.TBinaryProtocol import TBinaryProtocolAcceleratedFactory
+
+def main():
+    run_roundtrip_fuzzer(TBinaryProtocolAcceleratedFactory)
+
+if __name__ == "__main__":
+    main() 
\ No newline at end of file
diff --git a/lib/py/test/fuzz/fuzz_roundtrip_TCompactProtocol.py b/lib/py/test/fuzz/fuzz_roundtrip_TCompactProtocol.py
new file mode 100644
index 0000000..0fb9cce
--- /dev/null
+++ b/lib/py/test/fuzz/fuzz_roundtrip_TCompactProtocol.py
@@ -0,0 +1,27 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+from fuzz_common import run_roundtrip_fuzzer
+from thrift.protocol.TCompactProtocol import TCompactProtocolFactory
+
+def main():
+    run_roundtrip_fuzzer(TCompactProtocolFactory)
+
+if __name__ == "__main__":
+    main() 
\ No newline at end of file
diff --git a/lib/py/test/fuzz/fuzz_roundtrip_TCompactProtocolAccelerated.py b/lib/py/test/fuzz/fuzz_roundtrip_TCompactProtocolAccelerated.py
new file mode 100644
index 0000000..0465b2b
--- /dev/null
+++ b/lib/py/test/fuzz/fuzz_roundtrip_TCompactProtocolAccelerated.py
@@ -0,0 +1,27 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+from fuzz_common import run_roundtrip_fuzzer
+from thrift.protocol.TCompactProtocol import TCompactProtocolAcceleratedFactory
+
+def main():
+    run_roundtrip_fuzzer(TCompactProtocolAcceleratedFactory)
+
+if __name__ == "__main__":
+    main() 
\ No newline at end of file
