How to convert a client-side script into a server-side script
In this section, we show how to convert a Python script into a script that can be run server-side. We recommend that you read OMERO.scripts guide.
Description
We will make a simple Hello World
script as client-side Python script
and show how to convert it into a server-side script.
The script will:
Connect to the server
Load images in a dataset
Setup
We recommend to use a Conda environment to install the OMERO Python bindings. Please read first Install omero-py.
Step-by-step
The scripts used in this document are hello_world.py
and hello_world_server.py
.
It is also available as the ‘OMEROHelloWorld’ Jupyter notebook in the notebooks section.
Client-side script
Let’s first start by writing a client-side script named hello_world.py
.
Connect to the server:
def connect(hostname, username, password):
"""
Connect to an OMERO server
:param hostname: Host name
:param username: User
:param password: Password
:return: Connected BlitzGateway
"""
conn = BlitzGateway(username, password,
host=hostname, secure=True)
conn.connect()
conn.c.enableKeepAlive(60)
return conn
Load the images in the dataset:
def load_images(conn, dataset_id):
"""
Load the images in the specified dataset
:param conn: The BlitzGateway
:param dataset_id: The dataset's id
:return: The Images or None
"""
dataset = conn.getObject("Dataset", dataset_id)
images = []
for image in dataset.listChildren():
images.append(image)
if len(images) == 0:
return None
for image in images:
print("---- Processing image", image.id)
return images
Collect the script parameters:
host = input("Host [wss://workshop.openmicroscopy.org/omero-ws]: ") or 'wss://workshop.openmicroscopy.org/omero-ws' # noqa
username = input("Username [trainer-1]: ") or 'trainer-1'
password = getpass("Password: ")
dataset_id = input("Dataset ID [2391]: ") or '2391'
In order to use the methods implemented above in a proper standalone script:
Wrap it all up and call them from main
:
if __name__ == "__main__":
try:
# Collect parameters
host = input("Host [wss://workshop.openmicroscopy.org/omero-ws]: ") or 'wss://workshop.openmicroscopy.org/omero-ws' # noqa
username = input("Username [trainer-1]: ") or 'trainer-1'
password = getpass("Password: ")
dataset_id = input("Dataset ID [2391]: ") or '2391'
# Connect to the server
conn = connect(host, username, password)
# Load the images container in the specified dataset
load_images(conn, dataset_id)
finally:
conn.close()
print("done")
Server-side script
Now let’s see how to convert the script above into a server-side script.
The first step is to declare the parameters, the UI components will be built automatically from it. This script only needs to collect the dataset ID:
# Define the script name and description, and a single 'required' parameter
client = scripts.client(
'Hello World.py',
"""
This script does connect to OMERO.
""",
scripts.Long("datasetId", optional=False),
authors=["OME Team", "OME Team"],
institutions=["University of Dundee"],
contact="ome-users@lists.openmicroscopy.org.uk",
)
Process the arguments:
script_params = {}
for key in client.getInputKeys():
if client.getInput(key):
script_params[key] = client.getInput(key, unwrap=True)
dataset_id = script_params["datasetId"]
Access the data using the Python gateway:
conn = BlitzGateway(client_obj=client)
We can then use the same method that the one in the client-side script to load the images:
def load_images(conn, dataset_id):
"""
Load the images in the specified dataset
:param conn: The BlitzGateway
:param dataset_id: The dataset's id
:return: The Images or None
"""
dataset = conn.getObject("Dataset", dataset_id)
images = []
if dataset is None:
return None
for image in dataset.listChildren():
images.append(image)
if len(images) == 0:
return None
for image in images:
print("---- Processing image", image.id)
return images
In order to use the methods implemented above in a proper standalone script and return the output to the users, wrap it all up and call them from main:
if __name__ == "__main__":
# Start declaration
# Define the script name and description, and a single 'required' parameter
client = scripts.client(
'Hello World.py',
"""
This script does connect to OMERO.
""",
scripts.Long("datasetId", optional=False),
authors=["OME Team", "OME Team"],
institutions=["University of Dundee"],
contact="ome-users@lists.openmicroscopy.org.uk",
)
# Start script
try:
# process the list of arguments
script_params = {}
for key in client.getInputKeys():
if client.getInput(key):
script_params[key] = client.getInput(key, unwrap=True)
dataset_id = script_params["datasetId"]
# wrap client to use the Blitz Gateway
conn = BlitzGateway(client_obj=client)
# load the images
images = load_images(conn, dataset_id)
# return output to the user
if images is None:
message = "No images found"
else:
message = "Returned %s images" % len(images)
# return first image:
client.setOutput("Image", robject(images[0]._obj))
client.setOutput("Message", rstring(message))
# end output
finally:
client.closeSession()