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

# nemo_gym.sandbox.providers.local.provider

## Module Contents

### Classes

| Name                                                                        | Description                                                                           |
| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| [`LocalProvider`](#nemo_gym-sandbox-providers-local-provider-LocalProvider) | Runs commands on the host. No isolation: use a container provider for untrusted code. |

### Data

[`LOGGER`](#nemo_gym-sandbox-providers-local-provider-LOGGER)

[`REAP_TIMEOUT_S`](#nemo_gym-sandbox-providers-local-provider-REAP_TIMEOUT_S)

[`SANDBOX_RUNTIME_RETURN_CODE`](#nemo_gym-sandbox-providers-local-provider-SANDBOX_RUNTIME_RETURN_CODE)

### API

```python
class nemo_gym.sandbox.providers.local.provider.LocalProvider(
    workspace_root: str | None = None,
    shell: str = '/bin/bash',
    default_timeout_s: float = 180.0,
    concurrency: int = 8
)
```

Runs commands on the host. No isolation: use a container provider for untrusted code.

**`_semaphore`**

---

**`_semaphores`** `dict[int, Semaphore] = {}`

---

**`_workspace_root`**

---

**`name`** `= 'local'`

---

```python
nemo_gym.sandbox.providers.local.provider.LocalProvider.aclose() -> None
```

async

```python
nemo_gym.sandbox.providers.local.provider.LocalProvider.close(
    handle: nemo_gym.sandbox.providers.base.SandboxHandle
) -> None
```

async

```python
nemo_gym.sandbox.providers.local.provider.LocalProvider.create(
    spec: nemo_gym.sandbox.providers.base.SandboxSpec
) -> nemo_gym.sandbox.providers.base.SandboxHandle
```

async

A caller-supplied workdir is theirs to keep. One we allocate is ours to delete.

```python
nemo_gym.sandbox.providers.local.provider.LocalProvider.download_file(
    handle: nemo_gym.sandbox.providers.base.SandboxHandle,
    source_path: str,
    target_path: pathlib.Path
) -> None
```

async

```python
nemo_gym.sandbox.providers.local.provider.LocalProvider.exec(
    handle: nemo_gym.sandbox.providers.base.SandboxHandle,
    command: str,
    cwd: str | None = None,
    env: dict[str, str] | None = None,
    timeout_s: int | float | None = None,
    user: str | int | None = None
) -> nemo_gym.sandbox.providers.base.SandboxExecResult
```

async

Own session, so a timeout kills the whole process tree.

```python
nemo_gym.sandbox.providers.local.provider.LocalProvider.status(
    handle: nemo_gym.sandbox.providers.base.SandboxHandle
) -> nemo_gym.sandbox.providers.base.SandboxStatus
```

async

```python
nemo_gym.sandbox.providers.local.provider.LocalProvider.upload_file(
    handle: nemo_gym.sandbox.providers.base.SandboxHandle,
    source_path: pathlib.Path,
    target_path: str
) -> None
```

async

```python
nemo_gym.sandbox.providers.local.provider.LOGGER = logging.getLogger(__name__)
```

```python
nemo_gym.sandbox.providers.local.provider.REAP_TIMEOUT_S = 5.0
```

```python
nemo_gym.sandbox.providers.local.provider.SANDBOX_RUNTIME_RETURN_CODE = 125
```