Estoy tratando de ejecutar esta herramienta dentro de una función lambda: https://github.com/nicolas-f / 7DTD-leaflet

La herramienta depende de Pillow, que depende de bibliotecas de imágenes no disponibles en el contenedor lambda de AWS. Para intentar solucionar esto, ejecuté pyinstaller para crear un binario que espero poder ejecutar. Este archivo se llama map_reader y se encuentra en el nivel superior del paquete zip lambda.

A continuación se muestra el código que estoy usando para probar y ejecutar la herramienta:

command = 'chmod 755 map_reader'
args = shlex.split(command)
print subprocess.Popen(args)

command = './map_reader -g "{}" -t "{}"'.format('/tmp/mapFiles', '/tmp/tiles')
args = shlex.split(command)
print subprocess.Popen(args)

Y aquí está el error, que ocurre en la segunda llamada subprocess.Popen:

<subprocess.Popen object at 0x7f08fa100d10>
[Errno 13] Permission denied: OSError

¿Cómo puedo ejecutar esto correctamente?

9
stevepkr84 14 ene. 2017 a las 17:37

3 respuestas

Hubo dos problemas aquí. Primero, según la respuesta de Jeshan, tuve que mover el binario a / tmp antes de poder acceder a él correctamente.

El otro problema era que había ejecutado pyinstaller en ubuntu, creando un solo archivo. Vi en otros lugares algunos comentarios sobre asegurarse de compilar en la misma arquitectura que se ejecuta el contenedor lambda. Por lo tanto, ejecuté pyinstaller en ec2 basado en la AMI de Amazon Linux. El resultado fue múltiples archivos .os, que cuando se movieron a tmp, funcionaron como se esperaba.

2
stevepkr84 16 ene. 2017 a las 10:38

Sé que llego un poco tarde para esto, pero si desea una forma más genérica de hacerlo (por ejemplo, si tiene muchos binarios y podría no usarlos todos), así es como lo hago, siempre que coloque todos sus archivos binarios en una carpeta bin al lado de su archivo py, y todas las bibliotecas en una carpeta lib :

import shutil
import time
import os
import subprocess

LAMBDA_TASK_ROOT = os.environ.get('LAMBDA_TASK_ROOT', os.path.dirname(os.path.abspath(__file__)))
CURR_BIN_DIR = os.path.join(LAMBDA_TASK_ROOT, 'bin')
LIB_DIR = os.path.join(LAMBDA_TASK_ROOT, 'lib')
### In order to get permissions right, we have to copy them to /tmp
BIN_DIR = '/tmp/bin'

# This is necessary as we don't have permissions in /var/tasks/bin where the lambda function is running
def _init_bin(executable_name):
    start = time.clock()
    if not os.path.exists(BIN_DIR):
        print("Creating bin folder")
        os.makedirs(BIN_DIR)
    print("Copying binaries for "+executable_name+" in /tmp/bin")
    currfile = os.path.join(CURR_BIN_DIR, executable_name)
    newfile  = os.path.join(BIN_DIR, executable_name)
    shutil.copy2(currfile, newfile)
    print("Giving new binaries permissions for lambda")
    os.chmod(newfile, 0775)
    elapsed = (time.clock() - start)
    print(executable_name+" ready in "+str(elapsed)+'s.')

# then if you're going to call a binary in a cmd, for instance pdftotext :

_init_bin('pdftotext')
cmdline = [os.path.join(BIN_DIR, 'pdftotext'), '-nopgbrk', '/tmp/test.pdf']
subprocess.check_call(cmdline, shell=False, stderr=subprocess.STDOUT)
6
zoubida13 1 mar. 2017 a las 15:11
copyfile('/var/task/yourbinary', '/tmp/yourbinary')
os.chmod('/tmp/yourbinary', 0555)

Mover el binario a /tmp y hacerlo ejecutable funcionó para mí

1
Carlos Rendon 22 ene. 2017 a las 22:47