2011-03-09 47 views
5

Quiero crear una carpeta con enlaces simbólicos a todos los archivos en una estructura de directorio grande. Usé subprocess.call(["cmd", "/C", "mklink", linkname, filename]) primero, y funcionó, pero abrió una nueva ventana de comandos para cada enlace simbólico.Ejecutar comandos de Windows CMD a través de Python

no podía encontrar la manera de ejecutar el comando en segundo plano sin una ventana a aparecer, así que ahora estoy tratando de mantener una ventana CMD abrir y ejecutar comandos a través de la entrada estándar no:

def makelink(fullname, targetfolder, cmdprocess): 
    linkname = os.path.join(targetfolder, re.sub(r"[\/\\\:\*\?\"\<\>\|]", "-", fullname)) 
    if not os.path.exists(linkname): 
     try: 
      os.remove(linkname) 
      print("Invalid symlink removed:", linkname) 
     except: pass 
    if not os.path.exists(linkname): 
     cmdprocess.stdin.write("mklink " + linkname + " " + fullname + "\r\n") 

donde

cmdprocess = subprocess.Popen("cmd", 
           stdin = subprocess.PIPE, 
           stdout = subprocess.PIPE, 
           stderr = subprocess.PIPE) 

Sin embargo, ahora me sale este error:

File "mypythonfile.py", line 181, in makelink 
cmdprocess.stdin.write("mklink " + linkname + " " + fullname + "\r\n") 
TypeError: 'str' does not support the buffer interface 

Lo que significa esto y cómo puedo resolver esto?

Respuesta

1

Las cadenas de Python son Unicode, pero la tubería para la que está escribiendo solo admite bytes. Pruebe:

cmdprocess.stdin.write(("mklink " + linkname + " " + fullname + "\r\n").encode("utf-8")) 
+0

Ah. Eso fue eso, gracias. Ahora todo esto deja de funcionar después de 10 o más archivos ... ¿tal vez también sabes algo de eso? Hice una nueva pregunta en http://stackoverflow.com/questions/5253835/yet-another-python-windows-cmd-mklink-problem-cant-get-it-to-work THX –

Cuestiones relacionadas