The Python extension enhances Trigger.dev's build process by enabling limited support for executing Python scripts within your tasks.
This extension introduces the pythonExtension
build extension, which offers several key capabilities:
- Install Python Dependencies (Except in Dev): Automatically installs Python and specified dependencies using
pip
. - Requirements File Support: You can specify dependencies in a
requirements.txt
file. - Inline Requirements: Define dependencies directly within your
trigger.config.ts
file using therequirements
option. - Virtual Environment: Creates a virtual environment (
/opt/venv
) inside containers to isolate Python dependencies. - Helper Functions: Provides a variety of functions for executing Python code:
run
: Executes Python commands with proper environment setup.runInline
: Executes inline Python code directly from Node.runScript
: Executes standalone.py
script files.
- Custom Python Path: In development, you can configure
devPythonBinaryPath
to point to a custom Python installation.
- Add the extension to your
trigger.config.ts
file:
import { defineConfig } from "@trigger.dev/sdk/v3";
import { pythonExtension } from "@trigger.dev/python/extension";
export default defineConfig({
project: "<project ref>",
build: {
extensions: [
pythonExtension({
requirementsFile: "./requirements.txt", // Optional: Path to your requirements file
devPythonBinaryPath: ".venv/bin/python", // Optional: Custom Python binary path
scripts: ["src/python/**/*.py"], // Glob pattern for Python scripts
}),
],
},
});
- (Optional) Create a
requirements.txt
file in your project root with the necessary Python dependencies.
pandas==1.3.3
numpy==1.21.2
import { defineConfig } from "@trigger.dev/sdk/v3";
import { pythonExtension } from "@trigger.dev/python/extension";
export default defineConfig({
project: "<project ref>",
build: {
extensions: [
pythonExtension({
requirementsFile: "./requirements.txt",
}),
],
},
});
- Execute Python scripts within your tasks using one of the provided functions:
import { task } from "@trigger.dev/sdk/v3";
import { python } from "@trigger.dev/python";
export const myScript = task({
id: "my-python-script",
run: async () => {
const result = await python.runScript("my_script.py", ["hello", "world"]);
return result.stdout;
},
});
export const myStreamingScript = task({
id: "my-streaming-python-script",
run: async () => {
// You can also stream the output of the script
const result = python.stream.runScript("my_script.py", ["hello", "world"]);
// result is an async iterable/readable stream
for await (const chunk of streamingResult) {
logger.debug("convert-url-to-markdown", {
url: payload.url,
chunk,
});
}
},
});
import { task } from "@trigger.dev/sdk/v3";
import { python } from "@trigger.dev/python";
export const myTask = task({
id: "to_datetime-task",
run: async () => {
const result = await python.runInline(`
import pandas as pd
pd.to_datetime("${+new Date() / 1000}")
`);
return result.stdout;
},
});
import { task } from "@trigger.dev/sdk/v3";
import { python } from "@trigger.dev/python";
export const pythonVersionTask = task({
id: "python-version-task",
run: async () => {
const result = await python.run(["--version"]);
return result.stdout; // Expected output: Python 3.12.8
},
});
- This is a partial implementation and does not provide full Python support as an execution runtime for tasks.
- Manual intervention may be required for installing and configuring binary dependencies in development environments.
For more detailed documentation, visit the official docs at Trigger.dev Documentation.