Python scp 将图像从 image_urls 复制到服务器
Python scp copy images from image_urls to server
我写了一个接收 url 并将其复制到所有服务器的函数。
服务器远程路径存储在 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))
我在最后一行收到这个错误 cannot open PIL.JpegImagePlugin.JpegImageFile: No such file
请告诉我代码有什么问题,我检查过url没有损坏
问题是 image_file
不是路径(字符串),它是一个对象。您的 os.system
调用正在构建一个需要路径的字符串。
您需要先将文件写入磁盘(可能使用 tempfile
模块),然后才能以这种方式将其传递给 scp
。
事实上,您根本不需要(至少您在代码片段中所做的)将其转换为 PIL Image
对象,您只需将其写入磁盘一次即可您已检索到它,然后将其传递给 scp
以移动它:
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))
您应该在使用完该文件后将其删除。
我写了一个接收 url 并将其复制到所有服务器的函数。 服务器远程路径存储在 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))
我在最后一行收到这个错误 cannot open PIL.JpegImagePlugin.JpegImageFile: No such file
请告诉我代码有什么问题,我检查过url没有损坏
问题是 image_file
不是路径(字符串),它是一个对象。您的 os.system
调用正在构建一个需要路径的字符串。
您需要先将文件写入磁盘(可能使用 tempfile
模块),然后才能以这种方式将其传递给 scp
。
事实上,您根本不需要(至少您在代码片段中所做的)将其转换为 PIL Image
对象,您只需将其写入磁盘一次即可您已检索到它,然后将其传递给 scp
以移动它:
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))
您应该在使用完该文件后将其删除。