// 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.
= Ignite for Python

This chapter explains system requirements for running Ignite and how to install Ignite, start a cluster, and run a simple Hello World example using a thin link:thin-clients/python-thin-client[client for Python].

Thin Client is a lightweight Ignite connection mode. It does not participate in the cluster, never holds any data, or performs computations.
All it does is establish a socket connection to one or multiple Ignite nodes and perform all operations through those nodes.

== Prerequisites

Ignite was tested on:

include::includes/prereqs.adoc[]

and:

[cols="1,3"]
|=======================================================================
|Python |Version 3.4 or above
|=======================================================================

== Installing Ignite

include::includes/install-ignite.adoc[]

Once that's done, execute the following command to install the Python Thin Client package.
This thin client is abbreviated as `pyignite`:

include::includes/install-python-pip.adoc[]

== Starting a Node

Before connecting to Ignite via the Python thin client, you must start at least one Ignite cluster node.

include::includes/starting-node.adoc[]

== Running Your First Application

Once the cluster is started, you can use the Ignite Python thin client to perform cache operations.

Assuming that the server node is running locally, here is a _HelloWorld_ example that puts and gets values from the cache:

.hello.py
[source,python]
----
from pyignite import Client

client = Client()
client.connect('127.0.0.1', 10800)

#Create cache
my_cache = client.create_cache('my cache')

#Put value in cache
my_cache.put(1, 'Hello World')

#Get value from cache
result = my_cache.get(1)
print(result)
----

To run this, you can save the example as a text file (hello.py for example) and run it from the command line:


[source, python]
----
python3 hello.py
----

Or you can enter the example into your Python interpreter/shell (IDLE on Windows, for example) and modify/execute it there.


== Further Examples

Explore more Ignite Python examples link:{githubUrl}/modules/platforms/python/examples[here^].
