## Python Language (deprecated)

*Available as of Camel version 1.0*

Camel supports http://www.python.org/[Python] among other
link:scripting-languages.html[Scripting Languages] to allow an
link:expression.html[Expression] or link:predicate.html[Predicate] to be
used in the link:dsl.html[DSL] or link:xml-configuration.html[Xml
Configuration].

To use a Python expression use the following Java code

[source,text]
---------------------------------------
... python("somePythonExpression") ... 
---------------------------------------

For example you could use the *python* function to create an
link:predicate.html[Predicate] in a link:message-filter.html[Message
Filter] or as an link:expression.html[Expression] for a
link:recipient-list.html[Recipient List]

### Python Language Options

// language options: START
The Python language supports 1 options which are listed below.



[width="100%",cols="2,1m,1m,6",options="header"]
|=======================================================================
| Name | Default | Java Type | Description
| trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks
|=======================================================================
// language options: END

### Example

In the sample below we use Python to create a
link:predicate.html[Predicate] use in the route path, to route exchanges
from admin users to a special queue.

[source,java]
--------------------------------------------------------------------------------------
    from("direct:start")
        .choice()
            .when().python("request.headers['user'] == 'admin'").to("seda:adminQueue")
        .otherwise()
            .to("seda:regularQueue");
--------------------------------------------------------------------------------------

And a Spring DSL sample as well:

[source,xml]
-------------------------------------------------------------------
    <route>
        <from uri="direct:start"/>
        <choice>
            <when>
                <python>request.headers['user'] == 'admin'</python>
                <to uri="seda:adminQueue"/>
            </when>
            <otherwise>
                <to uri="seda:regularQueue"/>
            </otherwise>
        </choice>
    </route>
-------------------------------------------------------------------

### ScriptContext

The JSR-223 scripting languages ScriptContext is pre configured with the
following attributes all set at `ENGINE_SCOPE`:

[width="100%",cols="10%,10%,80%",options="header",]
|=======================================================================
|Attribute |Type |Value

|context |`org.apache.camel.CamelContext` |The Camel Context ( It cannot be used in groovy)

|camelContext |`org.apache.camel.CamelContext` |The Camel Context

|exchange |`org.apache.camel.Exchange` |The current Exchange

|request |`org.apache.camel.Message` |The message (IN message)

|response |`org.apache.camel.Message` |*Deprecated*: The OUT message. The OUT message if null by default. Use
IN message instead.

|properties |`org.apache.camel.builder.script.PropertiesFunction` |*Camel 2.9:* Function with a `resolve` method to make it easier to use
Camels link:properties.html[Properties] component from scripts. See
further below for example.
|=======================================================================

See link:scripting-languages.html[Scripting Languages] for the list of
languages with explicit DSL support.

### Additional arguments to ScriptingEngine

*Available as of Camel 2.8*

You can provide additional arguments to the `ScriptingEngine` using a
header on the Camel message with the key `CamelScriptArguments`. +
 See this example:

### Using properties function

*Available as of Camel 2.9*

If you need to use the link:properties.html[Properties] component from a
script to lookup property placeholders, then its a bit cumbersome to do
so. +
 For example to set a header name myHeader with a value from a property
placeholder, which key is provided in a header named "foo".

[source,java]
{% raw %}
--------------------------------------------------------------------------------------------------------------
.setHeader("myHeader").groovy("context.resolvePropertyPlaceholders('{{' + request.headers.get('foo') + '}}')")
--------------------------------------------------------------------------------------------------------------
{% endraw %}

From Camel 2.9 onwards you can now use the properties function and the
same example is simpler:

[source,java]
-------------------------------------------------------------------------------
.setHeader("myHeader").groovy("properties.resolve(request.headers.get('foo'))")
-------------------------------------------------------------------------------

### Loading script from external resource

*Available as of Camel 2.11*

You can externalize the script and have Camel load it from a resource
such as `"classpath:"`, `"file:"`, or `"http:"`. +
 This is done using the following syntax: `"resource:scheme:location"`,
eg to refer to a file on the classpath you can do:

[source,java]
-------------------------------------------------------------------
.setHeader("myHeader").groovy("resource:classpath:mygroovy.groovy")
-------------------------------------------------------------------

### How to get the result from multiple statements script

*Available as of Camel 2.14*

As the scripteengine evale method just return a Null if it runs a
multiple statments script. Camel now look up the value of script result
by using the key of "result" from the value set. If you have multiple
statements script, you need to make sure you set the value of result
variable as the script return value.

[source,text]
-------------------------------------------------------------
bar = "baz";
# some other statements ... 
# camel take the result value as the script evaluation result
result = body * 2 + 1
-------------------------------------------------------------

 

### Dependencies

To use scripting languages in your camel routes you need to add the a
dependency on *camel-script* which integrates the JSR-223 scripting
engine.

If you use maven you could just add the following to your pom.xml,
substituting the version number for the latest & greatest release (see
link:download.html[the download page for the latest versions]).

[source,xml]
---------------------------------------
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-script</artifactId>
  <version>x.x.x</version>
</dependency>
---------------------------------------