Source code for apsbits.api.run_instrument
#!/usr/bin/env python3
"""
Run an instrument's startup module and return the ophyd registry information.
This module provides functionality to dynamically import and run a package's
startup module, then return the ophyd registry information.
"""
__version__ = "1.0.0"
import argparse
import importlib
import sys
from typing import Any
from typing import Dict
from typing import Optional
from typing import Tuple
from apsbits.utils.controls_setup import oregistry as Registry
[docs]
def run_instrument_startup(package_name: str) -> Tuple[bool, Optional[Dict[str, Any]]]:
"""
Run a package's startup module and return the ophyd registry information.
:param package_name: The name of the package to run.
:return: A tuple containing a boolean indicating success and the registry
information.
"""
try:
# Import the startup module
startup_module = importlib.import_module(f"{package_name}.startup")
# Run the startup module
if hasattr(startup_module, "main"):
startup_module.main()
# Get the registry information
registry_info = {}
for name, obj in Registry.registry.items():
registry_info[name] = {
"type": obj.__class__.__name__,
"module": obj.__class__.__module__,
}
return True, registry_info
except ImportError as exc:
print(f"Error importing {package_name}.startup: {exc}", file=sys.stderr)
return False, None
except Exception as exc:
print(f"Error running {package_name}.startup: {exc}", file=sys.stderr)
return False, None
[docs]
def main() -> None:
"""
Parse arguments and run the instrument startup.
:return: None
"""
parser = argparse.ArgumentParser(
description=(
"Run an instrument's startup module and return the ophyd registry "
"information."
)
)
parser.add_argument("package_name", type=str, help="Name of the package to run.")
parser.add_argument(
"--output",
"-o",
type=str,
help="Output file to write the registry information to.",
)
args = parser.parse_args()
success, registry_info = run_instrument_startup(args.package_name)
if not success:
sys.exit(1)
if registry_info:
print(f"Found {len(registry_info)} devices in the registry:")
for name, info in registry_info.items():
print(f" {name}: {info['type']} from {info['module']}")
if args.output:
import json
with open(args.output, "w") as f:
json.dump(registry_info, f, indent=2)
print(f"Registry information written to {args.output}")
else:
print("No devices found in the registry.")
if __name__ == "__main__":
main()