2011-05-18 10 views
8

¿Cómo escribo en el descriptor de archivo 3 de un objeto subproceso.Popen?Escribir en el descriptor 3 de un subproceso de Python. Objeto Popen

estoy tratando de lograr el cambio de dirección en el siguiente comando shell con Python (sin utilizar canalizaciones con nombre):

$ gpg --passphrase-fd 3 -c 3<passphrase.txt <filename.txt> filename.gpg 
+1

Tengo curiosidad por saber esto . No creo que sea directamente posible. Los objetos 'Popen' ofrecen controladores para stdout, stdin y stderr. No sé sobre otros. –

+0

Quizás OT, pero ¿conoce el proyecto python-gnupg que proporciona una API de Python para GnuPG? Consulte http://code.google.com/p/python-gnupg/ para obtener más información. (Divulgación: es mi proyecto) –

+0

Miré algunas envolturas gpg de Python, y la suya parece bastante viable, pero mi proyecto actual es tan pequeño que intento minimizar las dependencias. – aaronstacy

Respuesta

5

El subproceso proc descriptores de archivo hereda abiertos en el proceso padre. Para que pueda usar os.open para abrir passphrase.txt y obtener su descriptor de archivo asociado. Podrá construir un comando que utiliza ese descriptor de archivo:

import subprocess 
import shlex 
import os 

fd=os.open('passphrase.txt',os.O_RDONLY) 
cmd='gpg --passphrase-fd {fd} -c'.format(fd=fd) 
with open('filename.txt','r') as stdin_fh: 
    with open('filename.gpg','w') as stdout_fh:   
     proc=subprocess.Popen(shlex.split(cmd), 
           stdin=stdin_fh, 
           stdout=stdout_fh)   
     proc.communicate() 
os.close(fd) 

para leer de una tubería en lugar de un archivo, se puede usar os.pipe:

import subprocess 
import shlex 
import os 

PASSPHRASE='...' 

in_fd,out_fd=os.pipe() 
os.write(out_fd,PASSPHRASE) 
os.close(out_fd) 
cmd='gpg --passphrase-fd {fd} -c'.format(fd=in_fd) 
with open('filename.txt','r') as stdin_fh: 
    with open('filename.gpg','w') as stdout_fh:   
     proc=subprocess.Popen(shlex.split(cmd), 
           stdin=stdin_fh, 
           stdout=stdout_fh)   
     proc.communicate() 
os.close(in_fd) 
+0

genial. entonces, si no quería mantener la contraseña en un archivo, podría crear un conducto, escribirle la frase de paso y usar su salida fd como el descriptor de archivo heredado donde gpg obtendría la frase de contraseña. – aaronstacy

+0

@aaronstacy: Sí, lo probé para estar seguro. (código publicado anteriormente) – unutbu

+0

Tenga en cuenta que existe un riesgo teórico de bloqueo si la contraseña es más grande que el buffer de tuberías del sistema operativo. Para estar seguro, tendría que hacer IO multiplexing, y escribir la contraseña después de iniciar el proceso. –

Cuestiones relacionadas