Search code examples
pythonpython-imaging-libraryurllibscp

Python scp copy images from image_urls to server


I have written one function which recieves a url and copy it to all server. Server remote path is stored in db.

def copy_image_to_server(image_url):

  server_list = ServerData.objects.values_list('remote_path', flat=True).filter(active=1)
  file = cStringIO.StringIO(urllib.urlopen(image_url).read())
  image_file = Image.open(file)
  image_file.seek(0)

  for remote_path in server_list:
    os.system("scp -i ~/.ssh/haptik  %s %s " % (image_file, remote_path))

I am geeting this error at last line cannot open PIL.JpegImagePlugin.JpegImageFile: No such file

Please suggest me what's wrong in the code, i have checked url is not broken


Solution

  • The problem is that image_file is not a path (string), it's an object. Your os.system call is building up a string that expects a path.

    You need to write the file to disk (perhaps using the tempfile module) before you can pass it to scp in this manner.

    In fact, there's no need for you (at least in what you're doing in the code snippet) to convert it to a PIL Image object at all, you can just write it to disk once you've retrieved it, and then pass it to scp to move it:

    file = cStringIO.StringIO(urllib.urlopen(image_url).read())
    diskfile = tempfile.NamedTemporaryFile(delete=False)
    diskfile.write(file.getvalue())
    path = diskfile.name
    diskfile.close()
    for remote_path in server_list:
        os.system("scp -i ~/.ssh/haptik  %s %s " % (path, remote_path))
    

    You should delete the file after you're done using it.