Ejecuta el comando bash en Cygwin desde otra aplicación

Desde una aplicación de Windows escrita en C ++ o python, ¿cómo puedo ejecutar comandos de shell arbitrarios?

Mi instalación de Cygwin normalmente se inicia desde el siguiente archivo bat:

@echo off C: chdir C:\cygwin\bin bash --login -i 

Desde Python, ejecute bash con os.system , os.popen o subprocess y pase los argumentos de línea de comando apropiados.

 os.system(r'C:\cygwin\bin\bash --login -c "some bash commands"') 

La siguiente función ejecutará el progtwig Bash de Cygwin mientras se asegura de que el directorio bin esté en la ruta del sistema, de modo que tenga acceso a comandos no integrados. Esta es una alternativa al uso de la opción de inicio de sesión (-l), que puede redirigirlo a su directorio de inicio.

 def cygwin(command): """ Run a Bash command with Cygwin and return output. """ # Find Cygwin binary directory for cygwin_bin in [r'C:\cygwin\bin', r'C:\cygwin64\bin']: if os.path.isdir(cygwin_bin): break else: raise RuntimeError('Cygwin not found!') # Make sure Cygwin binary directory in path if cygwin_bin not in os.environ['PATH']: os.environ['PATH'] += ';' + cygwin_bin # Launch Bash p = subprocess.Popen( args=['bash', '-c', command], stdout=subprocess.PIPE, stderr=subprocess.PIPE) p.wait() # Raise exception if return code indicates error if p.returncode != 0: raise RuntimeError(p.stderr.read().rstrip()) # Remove trailing newline from output return (p.stdout.read() + p.stderr.read()).rstrip() 

Ejemplo de uso:

 print cygwin('pwd') print cygwin('ls -l') print cygwin(r'dos2unix $(cygpath -u "C:\some\file.txt")') print cygwin(r'md5sum $(cygpath -u "C:\another\file")').split(' ')[0] 

Bash debería aceptar un comando de args al usar el indicador -c:

 C:\cygwin\bin\bash.exe -c "somecommand" 

Combine eso con el exec C ++ o el sistema os.system de os.system para ejecutar el comando.