También puede llamarlos a través del subprocess
módulo, pero ...
Para Python 2.7 y posteriores, simplemente use
subprocess.check_call(['open', filename])
En Python 3.5+ puedes usar de manera equivalente el más complejo pero también algo más versátil.
subprocess.run(['open', filename], check=True)
Si necesita ser compatible hasta Python 2.4, puede usar subprocess.call()
e implementar su propia comprobación de errores:
try:
retcode = subprocess.call("open " + filename, shell=True)
if retcode < 0:
print >>sys.stderr, "Child was terminated by signal", -retcode
else:
print >>sys.stderr, "Child returned", retcode
except OSError, e:
print >>sys.stderr, "Execution failed:", e
Ahora, ¿cuáles son las ventajas de usar subprocess
?
- Seguridad: en teoría, esto es más seguro, pero de hecho necesitamos ejecutar una línea de comando de una forma u otra; En cualquier entorno, necesitamos el entorno y los servicios para interpretar, obtener caminos, etc. En ninguno de los casos estamos ejecutando texto arbitrario, por lo que no tiene un problema inherente "pero puede escribir
'filename ; rm -rf /'
", y si el nombre del archivo puede estar dañado, el uso subprocess.call
nos brinda poca protección adicional.
- Manejo de errores: en realidad no nos da más detección de errores, todavía dependemos de los
retcode
casos; pero el comportamiento de generar explícitamente una excepción en el caso de un error ciertamente lo ayudará a notar si hay una falla (aunque en algunos escenarios, un rastreo puede no ser más útil que simplemente ignorar el error).
- Genera un subproceso (sin bloqueo) : no es necesario que esperemos el proceso secundario, ya que por enunciado del problema comenzamos un proceso separado.
A la objeción "Pero subprocess
se prefiere". Sin embargo, os.system()
no está en desuso, y en cierto sentido es la herramienta más simple para este trabajo en particular. Conclusión: usandoos.system()
es, por lo tanto, también una respuesta correcta.
Una desventaja marcada es que el start
comando de Windows requiere que pase, lo shell=True
que niega la mayoría de los beneficios del uso subprocess
.