Superar la limitación de os.system () en Python 2.3

Tengo un problema al convertir uno de los scripts de mi empresa de csh a Python. El script csh llama a un comando con alias, pero cuando llamo a ese mismo comando con alias a través de os.system (), no funciona.

Entonces, si foo es el comando con alias:

CSH Script (esto funciona, ejecuta foo):

foo <argument>

Python (esto no funciona, el error afirma que foo es un comando desconocido):

os.system("foo <argument>")

Supongo que debe haber algún tipo de cambio de contexto cuando ejecuto el script python, lo que hace que Python no tenga acceso a los alias creados en el shell. Después de leer la documentación, parece que os.system está en desuso a favor del subproceso, y ese subproceso tiene un parámetro de shell que podría ayudarme … el problema es que estoy atascado usando Python 2.3, y el subproceso no está disponible hasta la versión 2.4.

Tuve la idea de replicar el alias en python. Entonces, por ejemplo, digamos que foo tenía un alias para cp.

CSH:

alias foo cp
foo file1 file2

Pitón:

os.system("alias foo cp")
os.system("foo file1 file2")

Sin dados … errores aquí también:

sh: line 0: alias: foo: not found
sh: line 0: alias: cp: not found
sh: foo: command not found

Mi último esfuerzo es tomar las pocas líneas de código que usan foo y ponerlas en su propio script CSH que Python llamaría. Pero si hay una manera de hacer que esto funcione sin recurrir a eso, me encantaría saberlo.

¡Gracias por adelantado!

Mejor respuesta
¿Qué te hizo pensar que os.system usaría csh? Utiliza el sistema de función C estándar, que en el sistema Unix llamará simplemente basic / bin / sh. Esto no será csh, pero probablemente sea bash, o alguna versión más simple.

Por cierto: tenga en cuenta que lo que haga con el entorno de shell en os.system no afectará las llamadas posteriores a os.system, porque cada uno se ejecuta en un subshell diferente. En otras palabras, los cambios realizados en el medio ambiente se pierden. Y su llamada al alias falla, porque / bin / sh usa una sintaxis diferente para los alias que csh.

Puede solucionar esto ejecutando no foo, sino algo similar:

os.system("/bin/csh -i -c 'foo arg1 arg2'")

Tenga en cuenta la opción -i, que se supone que obliga a csh a leer los scripts de inicio.

Por favor indique la dirección original:Superar la limitación de os.system () en Python 2.3 - Código de registro