ejecuto un comando en Python usando la función subprocess.Popen() como el siguiente:pitón: elevar child_exception, OSError: [Errno 2] No existe el fichero o directorio
omp_cmd = 'cat %s | omp -h %s -u %s -w %s -p %s -X -' %(temp_xml, self.host_IP, self.username, self.password, self.port)
xmlResult = Popen(omp_cmd, stdout=PIPE, stderr=STDOUT)
En el shell funciona muy bien y sin error, pero en Python me sale:
File "/home/project/vrm/apps/audit/models.py", line 148, in sendOMP
xmlResult = Popen(omp_cmd, stdout=PIPE, stderr=STDOUT)
File "/usr/local/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/local/lib/python2.7/subprocess.py", line 1228, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
busqué el error, pero ninguno de ellos resolvió mi problema. ¿Alguien sabe cuál es la causa de este problema? Gracias.
¡Tienes razón! Una pregunta más, si shell = False, ¿deberían los args ser una lista, verdad? ¿Cuál es la diferencia entre estas dos formas? –
Para responder a su pregunta, ese comando que almaceno en el archivo tiene 9000 líneas de longitud, mi sistema operativo me dará "arg list too long error" :) –
@da_zhuang - sí, con 'shell = False', los argumentos son típicamente una lista. Usé la función 'shlex.split' que toma una cadena y la divide en una lista de la misma forma que un shell típico. con 'shell = True', pasas una cadena y esa cadena es evaluada por un shell. con 'shell = False' pasas una cadena o una lista. Si es una cadena, se evalúa como si fuera el único comando. ('" ls -l "' fallaría ya que no existe el comando 'ls -l', solo' ls'). Si se trata de una lista, cada elemento se toma como argumento. '[" ls "," -l "]' – mgilson