Prerequisites and connection details for attaching to a live Python process with PyFlightProfiler. Read this skill first before using any other PyFlightProfiler command (watch, trace, stack, perf, etc.).
日本語の概要は準備中です。原文の説明を表示しています。
Display input/output args, return object and cost time of a Python method invocation in a live process. Use this to observe function behavior at runtime — see what arguments go in, what comes back, and how long it takes. This is the most frequently used diagnostic command.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Display the input/output args, return object and cost time of method invocation. This is the most commonly used command for understanding runtime behavior of a specific function.
Prerequisites: Read the flight-profiler-attach skill first for platform requirements, installation, permissions, and connection details.
flight_profiler <pid> --cmd "watch module [class] method [options]" --no-color --timeout <seconds>
-n bounds how many invocations are captured; --timeout bounds how long to
wait for them. Always pass both — without a deadline the command blocks forever
when the target function is never called. Exit code 124 means the window
elapsed with no invocation observed, which is a result, not an error.
module — the module name as it would be imported in the target process. For example, if the target code does from myapp.utils import helper, then module is myapp.utils. PyFlightProfiler locates the module via importlib.import_module. If you're unsure of the module name, run a separate command to resolve it first: flight_profiler <pid> --cmd "module /absolute/path/to/file.py" --no-color, then use the returned module name here.class (optional) — class name, omit if the method is a module-level functionmethod — target method name| Flag | Description | Default |
|---|---|---|
--expr <value> | Watch expression. Available variables: target, return_obj, *args, **kwargs (note: cost is NOT available in expr, only in filter) | args,kwargs |
-x, --expand <value> | Object tree expand level (1-4, or -1 for infinity) | 1 |
-e, --exception | Only record when method throws exception | off |
-nm, --nested-method <value> | Watch nested method with depth restrict to 1 | none |
-r, --raw | Use __str__ (equivalent to print(obj)) instead of default JSON serialization | off |
-v, --verbose | Display all nested items in target list or dict (no truncation) | off |
-n, --limits <value> | Max display count, auto-stops after reaching limit | 10 |
-f, --filter <value> | Filter expression. Available variables: target, return_obj, cost, args, kwargs | none |
--expr--expr directly controls what you see in the output. Always match the user's intent to the right expression — the default args,kwargs only shows inputs, not outputs.
| User intent | --expr value |
|---|---|
| See input arguments | args,kwargs (default) |
| See return value / output | return_obj |
| See both input and output | args,kwargs,return_obj |
| See input, output, and the object itself | target,args,kwargs,return_obj |
| See a specific return field | return_obj['field_name'] |
| See the class instance (self) | target |
| See everything | target,args,kwargs,return_obj |
When the user says "input/output", "args and return", "what goes in and comes back", or similar — always use --expr args,kwargs,return_obj, never just the default.
Each captured invocation produces output in this format:
────────────────────────────────────────────────────────────
✓ 2026-04-19 10:33:36:520 method=__main__.compute cost=2.380133ms is_exp=False result={
EXPR: args,kwargs
TYPE: <class 'tuple'>
VALUE: (
(25, 26),
{}
)
}
| Field | Description |
|---|---|
✓ / ✗ | Success or exception indicator |
| Timestamp | When the method was called (yyyy-MM-dd HH:mm:ss:SSS) |
method | Fully qualified method name: module.method or module.class.method |
cost | Execution time in milliseconds (precision to microseconds) |
is_exp | True if the method threw an exception, False otherwise |
EXPR | The expression used to extract the displayed value |
TYPE | Python type of the expression result |
VALUE | The expression result, formatted as JSON (or __str__ if -r) |
EXCEPTION | (only when is_exp=True) Full traceback of the exception |
flight_profiler <pid> --cmd "watch __main__ compute -n 1" --no-color
Output:
────────────────────────────────────────────────────────────
✓ 2026-04-19 10:33:36:520 method=__main__.compute cost=2.380133ms is_exp=False result={
EXPR: args,kwargs
TYPE: <class 'tuple'>
VALUE: (
(
25,
26
),
{}
)
}
flight_profiler <pid> --cmd "watch __main__ compute --expr return_obj -n 1" --no-color
Output:
────────────────────────────────────────────────────────────
✓ ... method=__main__.compute cost=2.561092ms is_exp=False result={
EXPR: return_obj
TYPE: <class 'int'>
VALUE: 89
}
flight_profiler <pid> --cmd "watch __main__ fetch_data -n 1" --no-color
Output — args contains positional args, kwargs contains keyword args:
────────────────────────────────────────────────────────────
✓ ... method=__main__.fetch_data cost=0.010014ms is_exp=False result={
EXPR: args,kwargs
TYPE: <class 'tuple'>
VALUE: (
(
"SELECT *"
),
{
"limit": 5,
"timeout": 30
}
)
}
flight_profiler <pid> --cmd "watch __main__ UserService get_user -n 1" --no-color
Output — for class methods, self is automatically stripped from args:
────────────────────────────────────────────────────────────
✓ ... method=__main__.UserService.get_user cost=10.342121ms is_exp=False result={
EXPR: args,kwargs
TYPE: <class 'tuple'>
VALUE: (
(
46
),
{}
)
}
flight_profiler <pid> --cmd "watch __main__ UserService get_user --expr target,return_obj -n 1" --no-color
Output — target is the class instance (self), shown with its attributes:
────────────────────────────────────────────────────────────
✓ ... method=__main__.UserService.get_user cost=10.831118ms is_exp=False result={
EXPR: target,return_obj
TYPE: <class 'tuple'>
VALUE: (
UserService({}),
{
"active": True,
"id": 56,
"name": "user_56"
}
)
}
flight_profiler <pid> --cmd "watch __main__ UserService get_user --expr return_obj['name'] -n 1" --no-color
Output:
────────────────────────────────────────────────────────────
✓ ... method=__main__.UserService.get_user cost=12.423992ms is_exp=False result={
EXPR: return_obj['name']
TYPE: <class 'str'>
VALUE: "user_68"
}
flight_profiler <pid> --cmd "watch __main__ UserService get_user --expr return_obj -x 2 -n 1" --no-color
Output:
────────────────────────────────────────────────────────────
✓ ... method=__main__.UserService.get_user cost=12.030125ms is_exp=False result={
EXPR: return_obj
TYPE: <class 'dict'>
VALUE: {
"active": True,
"id": 81,
"name": "user_81"
}
}
flight_profiler <pid> --cmd "watch __main__ UserService delete_user -e -n 1" --no-color
Output — note ✗, is_exp=True, and the EXCEPTION field:
────────────────────────────────────────────────────────────
✗ ... method=__main__.UserService.delete_user cost=0.024080ms is_exp=True result={
EXPR: args,kwargs
TYPE: <class 'tuple'>
VALUE: (
(
58
),
{}
)
EXCEPTION: Traceback (most recent call last):
...
File "watch_demo_script.py", line 11, in delete_user
raise ValueError(f"Cannot delete user {user_id}")
ValueError: Cannot delete user 58
}
flight_profiler <pid> --cmd "watch __main__ compute -f cost>10 -n 3" --no-color
flight_profiler <pid> --cmd "watch __main__ compute -f args[0]>2 -n 1" --no-color
flight_profiler <pid> --cmd "watch __main__ UserService nested_outer -nm inner_calc -n 1" --no-color
Output — method shows the full path including nested function name:
────────────────────────────────────────────────────────────
✓ ... method=__main__.UserService.nested_outer.inner_calc cost=0.071049ms is_exp=False result={
EXPR: args,kwargs
TYPE: <class 'tuple'>
VALUE: (
(),
{}
)
}
__str__ instead of JSON serialization)flight_profiler <pid> --cmd "watch __main__ compute -r -n 1" --no-color
Output — VALUE uses __str__ (like print(obj)) instead of default JSON serialization:
────────────────────────────────────────────────────────────
✓ ... method=__main__.compute cost=2.539158ms is_exp=False result={
EXPR: args,kwargs
TYPE: <class 'tuple'>
VALUE: ((82, 83), {})
}
--expr Expression GuideThe --expr option controls what data is displayed for each invocation. It accepts any valid Python expression.
Available variables:
target — the class instance (self) for class methods; None for module-level functionsreturn_obj — the method's return value (None if exception was thrown)*args — positional arguments (for class methods, self is already stripped)**kwargs — keyword argumentsNote: cost is NOT available in --expr. Use -f filter to filter by cost.
Common patterns:
# Default: see all args and kwargs
--expr args,kwargs
# See only return value
--expr return_obj
# See args and return value together
--expr args,return_obj
# Extract a specific field from return value
--expr return_obj['key']
# Extract nested field
--expr return_obj['data']['items']
# See the class instance (self)
--expr target
# Combine target and return
--expr target,return_obj
# Use Python expressions
--expr len(args[0])
--expr type(return_obj)
-f Filter GuideThe -f option controls which invocations are displayed. Only invocations where the filter expression evaluates to True are shown.
Available variables:
target — the class instance (or None)return_obj — the return valuecost — execution time in millisecondsargs — positional arguments tuplekwargs — keyword arguments dictCommon patterns:
# Filter by execution time (cost in ms)
-f cost>10
-f cost>100
# Filter by argument value
-f args[0]>100
-f args[0]=="hello"
-f args[0]["query"]=="SELECT *"
# Filter by return value
-f return_obj is not None
-f return_obj['success']==True
-f len(return_obj)>0
# Filter by kwargs
-f kwargs.get('debug')==True
# Combine conditions
-f cost>10 and args[0]>0
-f return_obj is not None and cost<5
If watch produces no output, the most likely reason is the target method is not being called during the observation window. Before concluding there's a problem:
module command to verify the correct module name if unsure-f, the filter might be too restrictive. Try without -f first-n limits — if limits was reached in a previous watch, the method may already be unwatchedflight_profiler <pid> --cmd "watch __main__ compute -n 5" --no-color > /tmp/watch_output.txt
-n 1 capturing a single invocation), display the full result directly to the user so they can see the most relevant information immediately. If multiple invocations were captured, showing just one representative case is sufficient.When an object is too large to serialize or the output is truncated/incomplete:
Prefer minimal extraction — use --expr to extract only the fields you need, instead of the entire object:
# Instead of serializing the entire return object:
--expr return_obj
# Extract only the field you care about:
--expr return_obj['status']
--expr return_obj['data']['id']
--expr type(return_obj),len(return_obj)
Use -v (verbose) — if you do need the full object, add -v to disable truncation so all nested items in lists/dicts are shown completely.
-f filter runs inside the target process so it can reference live objects--expr option controls what gets printed; the -f option controls which invocations get printedcost is only available in -f filter, not in --exprself is automatically stripped from args — use target to access the instance-x 2 or -x 3 to expand nested objects in the output (max 4, or -1 for infinity)-r (raw) uses __str__ (like print(obj)) instead of JSON serialization — useful when objects have custom __str__ or you want the native Python representation-v (verbose) shows all items in lists/dicts without truncationflight_profiler/plugins/watch/cli_plugin_watch.pyflight_profiler/plugins/watch/watch_parser.pyflight_profiler/plugins/watch/server_plugin_watch.pyまだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Prerequisites and connection details for attaching to a live Python process with PyFlightProfiler. Read this skill first before using any other PyFlightProfiler command (watch, trace, stack, perf, etc.).
日本語の概要は準備中です。原文の説明を表示しています。
Inspect Python module global field or class static field value in a running Python process. Use this for safe, read-only inspection of global variables, configuration objects, or class-level state.
日本語の概要は準備中です。原文の説明を表示しています。
Translate a file path to its Python module name in a running Python process. Use this when you know a file path but need the module name for commands like watch, trace, or reload.
日本語の概要は準備中です。原文の説明を表示しています。
Hot-reload a Python function implementation from the latest file content without restarting the process. Use this to apply code fixes live after identifying a bug with watch/trace.
日本語の概要は準備中です。原文の説明を表示しています。
Inspect stack frames of a running Python process including thread stacks, native C-level frames, and async coroutine stacks. Use this to see what each thread is currently doing and diagnose hangs, deadlocks, or stuck async tasks.
日本語の概要は準備中です。原文の説明を表示しています。
Trace execution time of Python method invocations in a live process with call stack visualization. Use this to see a hierarchical call tree showing which sub-calls are slow and where time is spent within a function.
日本語の概要は準備中です。原文の説明を表示しています。