• Viernes 29 de Marzo de 2024, 12:40

Autor Tema:  Duda Ejecutar Comandos Del So Con Python  (Leído 4277 veces)

Ithimn

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Duda Ejecutar Comandos Del So Con Python
« en: Domingo 20 de Abril de 2008, 11:38 »
0
Hola a todos, soy nuevo por aquí. Mi problema está en que estoy haciendo una aplicación con Python en linux y en un punto de la aplicación intento ejecutar comandos del sistema operativo. Este comando en concreto acaba creando un archivo y me da el siguiente error:

            ValueError : I/O operation on closed file

El trozo de código es este:

            proc=subprocess.Popen(comando, shell=True, stdin=subprocess.PIPE)
            proc.communicate('contrasena')
            proc.communicate('contrasena')

, el comando no crea el archivo hasta que se le pasa la contraseña y se le confirma. Espero que alguien me pueda echar una mano y ver como puedo hacer que no me de el error al crear el archivo.

Un saludo a todos y gracias :hola:

RadicalEd

  • Moderador
  • ******
  • Mensajes: 2430
  • Nacionalidad: co
    • Ver Perfil
Re: Duda Ejecutar Comandos Del So Con Python
« Respuesta #1 en: Lunes 21 de Abril de 2008, 16:16 »
0
No entiendo muy bien, pero yo haría algo así:
Código: Text
  1. passwd = raw_input('Favor introducir password: ')
  2.  
  3. if passwd == 'tupassword':
  4.     archivo = open('test.log', 'w')
  5.     archivo.write('info a guardar')
  6.     archivo.close()
  7.  
  8.  
Una pregunta???, por qué vas a crear archivo a través de comando del sistema?, con la función open lo puedes hacer.
El pasado son solo recuerdos, el futuro son solo sueños

Ithimn

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Duda Ejecutar Comandos Del So Con Python
« Respuesta #2 en: Lunes 21 de Abril de 2008, 17:45 »
0
Te explico, la aplicación no es de consola, es gráfica. La estoy haciendo con wxPython  :comp: . En realidad es un frontend y con este frontend ejecuto comandos del sistema operativo. En un punto el comando introducido te pide contraseña el sistema operativo para encriptar un archivo que la ha puesto previamente el usuario desde la interfaz grafica en un cuadro de texto, con lo cual se la paso con "communicate", y una vez que le pasas esa contraseña el comando debe generar un archivo (es para lo que sirve el comando que utilizo no es que yo haya creado un archivo previamente). Entonces es cuando me da el error de I/O operation on closed file. No se si es que tengo que crear un archivo vacio antes o que hay que hacer exactamente. Si se os ocurre alguna cosa... estoy un poquillo desesperado con esto jeje. Muchas gracias RadicalEd, intentaré a lo mejor hacer un open('archivo','w') antes de ejecutar el comando del sistema a ver que pasa

 :alien:

RadicalEd

  • Moderador
  • ******
  • Mensajes: 2430
  • Nacionalidad: co
    • Ver Perfil
Re: Duda Ejecutar Comandos Del So Con Python
« Respuesta #3 en: Lunes 21 de Abril de 2008, 20:47 »
0
Lo que entiendo es que estás tratando de escribir o leer sobre un archivo cerrado.
Leete esto y entenderas.
Puedes mostrar todo el código para probar???
El pasado son solo recuerdos, el futuro son solo sueños

Ithimn

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Duda Ejecutar Comandos Del So Con Python
« Respuesta #4 en: Viernes 25 de Abril de 2008, 12:00 »
0
Siento no haber podido postear antes pero he estado muy liado. Creo que no me he explicado bien. Lo que estoy haciendo es un front-end para openssl. Entonces cuando envio el comando openssl a la linea de comandos pide una key para la encriptación/desencriptación y generaría si funcionase bien un archivo encriptado pero me da el error I/O on closed file (cosa normal pq ese archivo no ha sido creado antes). Voy a adjuntar lo que llevo hecho para que veas a lo que me refiero. El programa ahora mismo está un poquito provisional y estoy empezando con python asi que a lo mejor veis alguna cosa rara jejjeje :lol:  Venga un saludo.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

RadicalEd

  • Moderador
  • ******
  • Mensajes: 2430
  • Nacionalidad: co
    • Ver Perfil
Re: Duda Ejecutar Comandos Del So Con Python
« Respuesta #5 en: Viernes 25 de Abril de 2008, 15:17 »
0
Una pre???
En qué SO estás tratando de ejecutar este script???
Tienes instalado el openssl???
El pasado son solo recuerdos, el futuro son solo sueños

Ithimn

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Duda Ejecutar Comandos Del So Con Python
« Respuesta #6 en: Viernes 25 de Abril de 2008, 15:21 »
0
Utilizo Ubuntu 7.10. openssl si lo tengo instalado y funciona correctamente, lo he probado a hacer desde linea de comandos y encripta ok. Desde la aplicación que estoy programando tb ejecuta bien el comando, el error es que no genera el archivo encriptado por el error ese que comentaba que me ocurria, no se si es por algun problema con python y derechos para crear archivos desde este o si hay alguna forma de hacer lo que quiero.

RadicalEd

  • Moderador
  • ******
  • Mensajes: 2430
  • Nacionalidad: co
    • Ver Perfil
Re: Duda Ejecutar Comandos Del So Con Python
« Respuesta #7 en: Viernes 25 de Abril de 2008, 15:40 »
0
Por qué preguntas acá si el archivo == cerrado entonces ejecute el subprocess.Popen si lo estás abriendo una línea arriba:
Código: Text
  1.             f=open((destino + "archivo.enc"),'wb')
  2.             # Pasamos el comando como una lista    
  3.             if f.closed==False:
  4.                 #proc=subprocess.Popen(comando, shell=True, stdin=subprocess.PIPE,stdout=f)
  5.                 proc=subprocess.Popen(comando, shell=True, stdin=subprocess.PIPE, stdout=f)
  6.                 # Le paso de prueba una contrasena --> contrasena
  7.                 # AQUI ES DONDE SE PRODUCE EL ERROR
  8.                 proc.communicate('contrasena\n')
  9.                 proc.communicate('contrasena\n')
  10.  
  11.  
Como está abierto yo le dije if f.closed!=False: ejecute el resto y me creo el archivo.enc, pero como no tengo openssl en un XP 'tons me crea un archivo a 0 bytes, no sé si sea por ahí, ojala NRM pueda ayudar un poquito más.
El pasado son solo recuerdos, el futuro son solo sueños

Ithimn

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Duda Ejecutar Comandos Del So Con Python
« Respuesta #8 en: Viernes 25 de Abril de 2008, 15:47 »
0
Como me daba el error de que estaba ejecutando una operacion de I/O sobre un archivo cerrado pues probé a hacer un open para crear asi primero el archivo y tenerlo abierto pero me sigue dando igual. Con el subprocess.Popen lo que hace es pasar el comando a la linea de comandos no es que vuelva a abrir el archivo ni nada de eso. Luego el communicate es para pasarle la key de encriptación cuando la pide y la confirmación. A mi tb me crea el archivo de 0 bytes pero el error me da luego cuando intenta generar el archivo encriptado. Desde XP no podrás comprobarlo. Gracias de todos modos.

RadicalEd

  • Moderador
  • ******
  • Mensajes: 2430
  • Nacionalidad: co
    • Ver Perfil
Re: Duda Ejecutar Comandos Del So Con Python
« Respuesta #9 en: Viernes 25 de Abril de 2008, 15:51 »
0
Una pre???, aunque leyendo ahora un poco me dí cuenta que el subprocess tiene un poquito más de poder; por qué no usas os.system() y tratas de ejecutar la variable comando para ver que pasa???
El pasado son solo recuerdos, el futuro son solo sueños

Ithimn

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Duda Ejecutar Comandos Del So Con Python
« Respuesta #10 en: Sábado 26 de Abril de 2008, 02:41 »
0
Pues en un principio empecé a usar lo que tu comentas pero resulta que el modulo subprocess es modulo pensado para sustiuir a os.system(). Con os.system() envias el comando y punto con subprocess envias el comando y puedes recoger la salida estandar y comunicarte con la entrada estandar. Cuando envio el comando me pide la key de encriptación con lo cual necesito pasarle la key y creo que eso no lo puedo hacer con os.system() o no se como y con subprocess.communicate() puedo pasarle lo que quiera. :kicking: