> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.itential.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.itential.com/_mcp/server.

# iagctl create service python-script

Create a new Python script service.

The `iagctl create service python-script` command creates a Python script service in the gateway data store. You can then run the service with the `iagctl run` command. For more information, see [Create gateway services](../create-gateway-service).

Consider a Python script in a repository called `example-repo` with the following directory layout:

```bash
├── README.md
├── interface-scripts
│   ├── main.py
│   └── requirements.txt
```

To create a service from the script in the `interface-scripts` directory, specify the repository with `--repository`, the subdirectory with `--working-dir`, and the script file with `--filename`.

## Prerequisites

Before you create a Python script service, you need a repository that contains your script.

## Syntax

```bash
iagctl create service python-script <service-name> --repository <string> --filename <string> [flags]
```

## Usage notes

### Dependencies

If a `requirements.txt` file exists in the `--working-dir`, the gateway automatically installs the dependencies into a virtual environment and runs the script within that environment.

### Environment variables

Use the `--env` flag to set environment variables that the gateway applies at runtime. Specify each variable as a `key=value` pair.

### Decorators

You can attach a decorator to the service for input validation at runtime with the `--decorator` flag. For more information, see [iagctl create decorator](./create-decorator).

If a property's value is too large to pass safely as a CLI argument, mark it as file-backed in the decorator schema so Gateway writes it to a temporary file and passes your script an environment variable instead. For more information, see [Pass large values as files in Python script services](../using-decorators#pass-large-values-as-files-in-python-script-services).

File-backed properties are supported for Python script services only.

### Runtime arguments

For information on how Python scripts read arguments passed at runtime, see [iagctl run service python-script](./run-service-python-script).

## Examples

### Create a basic Python script service

The following example creates a service called `my-python-service` where the script `main.py` is at the root of the `my-repo` repository:

```bash
iagctl create service python-script my-python-service \
--repository my-repo \
--filename main.py
```

### Create a Python script service with all options

The following example creates a service that specifies a working directory, a decorator, environment variables, and metadata:

```bash
iagctl create service python-script interface-renamer \
--repository example-repo \
--filename main.py \
--working-dir interface-scripts \
--decorator my-decorator \
--description "A Python script to set an interface description" \
--env key1=value1 \
--env key2=value2 \
--tag interfaces
```

## Options

```bash
  --decorator string     The decorator to associate with the service.
  --description string   A brief description of the service.
  --env stringArray      Environment variables as key=value pairs. Provide multiple flags for multiple variables.
  --filename string      The Python script file in the repository. Must exist in the working directory. (default "main.py")
  -h, --help             Help for python-script.
  --repository string    The gateway repository that contains the Python script.
  --tag stringArray      Metadata tags to associate with the service.
  --working-dir string   Path to the directory where the script exists, relative to the repository root.
```

## Options inherited from parent commands

```bash
  --profile string   Specify the client profile to use (case-insensitive, defaults to [client] section)
  --config string   Path to the configuration file
  --raw             Display the result of the command in raw format
  --verbose         Enable verbose output
```