4

I am trying to load two images in, one uploaded image (trigger) and one from a hardcoded blob location.

def main(blobtrig: func.InputStream, medianimage: func.InputStream, blobout: func.Out[bytes]):
    logging.info(f"Python blob trigger function processed blob \n"
                 f"Stuff: {blobtrig.__dict__}\n")

    logging.info(f"Next Blob Name \n"
                 f"Stuff: {medianimage.__dict__}\n")

    input_image = blobtrig
    base_image = Image.open(input_image)

    med_image = medianimage
    logging.info(f"Med image read is {type(med_image)}")
    median_image = Image.open(med_image)

The first Image.open(input_image) works, but the second doesn't. I think the medianimage Inputstream is not pointing to the right place. My functions.json is like this...

{"scriptFile": "__init__.py","bindings": [
{
  "name": "blobtrig",
  "type": "blobTrigger",
  "direction": "in",
  "path": "facility-model-image-data/{name}",
  "connection": "AzureWebJobsStorage"
},
{
  "type": "blob",
  "direction": "in",
  "name": "medianimage",
  "path": "facility-model-image-data/median.jpg",
  "connection": "AzureWebJobsStorage"
},
{
  "type": "blob",
  "direction": "out",
  "name": "blobout",
  "path": "processed-images/{rand-guid}.jpg",
  "connection": "AzureWebJobsStorage"
}],"disabled": false, "scriptFile": "__init__.py"}

But the files printed by python logging are both the same even though medianimage should be pointing to a completely different file:

[02/02/2020 18:39:36] Stuff: {'_io': <_io.BytesIO object at 0x7f2cabdc0620>,
'_name': 'facility-model-image-data/test_gray.jpg', '_length': 152606,
'_uri': 'https://functionimageprocessor.blob.core.windows.net/facility-model-image-data/test_gray.jpg'}
[02/02/2020 18:39:36] 
[02/02/2020 18:39:36] Next Blob Name 
[02/02/2020 18:39:36] Stuff: {'_io': <_io.BytesIO object at 0x7f2cabdc0f10>,
'_name': 'facility-model-image-data/test_gray.jpg', '_length': 152606,
'_uri': 'https://functionimageprocessor.blob.core.windows.net/facility-model-image-data/test_gray.jpg'}

and the script fails here...

[02/02/2020 18:39:36] Stack:   File "/usr/lib/azure-functions-core-tools/workers/python/3.7/LINUX/X64/azure_functions_worker/dispatcher.py", line 312, in _handle__invocation_request
[02/02/2020 18:39:36]     self.__run_sync_func, invocation_id, fi.func, args)
[02/02/2020 18:39:36]   File "/usr/lib/python3.7/concurrent/futures/thread.py", line 57, in run
[02/02/2020 18:39:36]     result = self.fn(*self.args, **self.kwargs)
[02/02/2020 18:39:36]   File "/usr/lib/azure-functions-core-tools/workers/python/3.7/LINUX/X64/azure_functions_worker/dispatcher.py", line 431, in __run_sync_func
[02/02/2020 18:39:36]     return func(**params)
[02/02/2020 18:39:36]   File "/home/peter/Documents/Python/dataset-processing/functions/imageuploadtrigger/__init__.py", line 35, in main
[02/02/2020 18:39:36]     median_image = Image.open(med_image)#Image.frombytes('RGBA', (636,795), med_image, 'raw')

Been struggling with this for ages so any help would be great! Also sorry if the question formatting isn't the best (first time posting here).

1 Answer 1

3

This looks about right. I was unable to find any examples of using 2 different blobBindings with python, unfortunately. but both the blobTrigger and blobBinding are read via func.InputStream. My guess would be - this doesn't really work with python (perhaps a bug?). You can file an issue on Github.

Couple of workarounds:

  1. if that median.jpg is relatively static - you can just copy it locally to the function storage and read it without having to have a blobBinding
  2. if it's not - you can use Azure Storage SDK for python to read the file from the blob using the SDK, not the binding.
Sign up to request clarification or add additional context in comments.

1 Comment

Having to go the SDK route, median is not quite fixed. Thanks for the advice! For anyone looking the environment variable for connection string is in connect_str = os.getenv('AzureWebJobsStorage')

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.