Package: cygsubprocess
Executes Cygwin bash scripts/commands in Python, captures and prints the outputpip install cygsubprocessTested against Windows 10 / Python 3.10 / Anaconda / cygcheck (cygwin) 3.4.6fromcygsubprocessimportBashsubprocessba=Bashsubprocess(cygfolder=r'C:\cygwin',mirrorsite=None,addtopath=True)# If cygwin is not installed, it will be installed and added to the PATHba.convert_path_cyg2win("/cygdrive/c/Users/hansc/Downloads/ClipAngel 2.09")# r'C:\Users\hansc\Downloads\ClipAngel 2.09'ba.convert_path_win2cyg(path=r"C:\Users\hansc\Downloads\ClipAngel 2.09")#  '/cygdrive/c/Users/hansc/Downloads/ClipAngel 2.09'cmd1=ba.execute_capture("ls -la")print(cmd1.stdout_lines[:5])cmd2=ba.execute_capture(["ls -la | grep 'py'"])print(cmd2.stdout_lines[:5])cmd1=ba.execute_print_capture("ls -la")print(cmd1.stdout_lines[:5])cmd2=ba.execute_print_capture(["ls -la | grep 'py'"])print(cmd2.stdout_lines[:5])# gist downloadscriptexec=r"""slugify(){ echo "$1" | iconv -t ascii//TRANSLIT | sed -r s/[^a-zA-Z0-9]+/-/g | sed -r s/^-+\|-+$//g | tr A-Z a-z; }cnt=0; gh gist list --limit 3 | cut -f1,2 | tac | while read id name; do ((cnt++)); gh gist clone $id $cnt-`slugify "$name"`; done"""cmd4=ba.execute_print_capture(scriptexec)print(cmd4.stdout_lines)bashscr="""#!/bin/bash# set the STRING variableSTRING="Hello World!"# print the contents of the variable on screenecho $STRING"""bashtofile=ba.exec_sh_to_file(bashscr,printoutput=False)print(bashtofile.stdout_lines)bashscr=r"""#!/bin/bashsalary=1000expenses=800#Check if salary and expenses are equalif [ $salary == $expenses ];thenecho "Salary and expenses are equal"#Check if salary and expenses are not equalelif [ $salary != $expenses ];thenecho "Salary and expenses are not equal"fi"""bashtofile2=ba.exec_sh_directly(bashscr,printoutput=True)print(bashtofile2.stdout_lines)scriptfile='c:\\bashscripttest.sh'withopen(scriptfile,mode='w',encoding='utf-8',newline='\n')asf:f.write(bashscr)ba.installapt()# install apt  https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cygba.apt_install(package='hunspell-de')# install a package with aptba.apt_remove(package='hunspell-de')# remove a package with apttest2=ba.exec_sh_url(bashscr=r'https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg',printoutput=True)test3=ba.exec_sh_file(bashscr=scriptfile,printoutput=True)test4=ba.exec_sh_to_file(bashscr,printoutput=True)test5=ba.exec_sh_directly(bashscr,printoutput=True)test6=ba.get_list_of_files_no_stat(folder=r'C:\Python34')# windows and cyg path (escaped and unescaped)test7=ba.get_list_of_files_with_stat(folder=r'C:\Python34')# windows and cyg path (escaped and unescaped)....# b'-rwxr-x---+ 1 Administrators hansc    25749 Mar 31 23:52 trayinfo.py.bak\n'# b'-rwxr-x---+ 1 Administrators hansc      671 Apr  1 09:50 trayinfotest.py\n'# b'-rwxr-x---+ 1 Administrators hansc    25878 Apr  1 09:34 traymenuxxxxxxxxxx.py\n'# b'-rwxr-x---+ 1 Administrators hansc     4329 Apr  1 03:12 tw.py\n'# b'-rwxr-x---+ 1 Administrators hansc     8095 Apr  1 08:48 win10ctypestoastxxxxxxxxxx.py\n'# [b'drwxr-x---+ 1 hansc          hansc        0 Apr  1 13:01 1-pyde-py\n', b'drwxr-x---+ 1 hansc          hansc        0 Apr  1 13:14 1-stra-py\n', b'drwxr-x---+ 1 hansc          hansc        0 Apr  1 13:14 10-cygwinco-py\n', b'drwxr-x---+ 1 hansc          hansc        0 Apr  1 13:01 10-tracealllines-py\n', b'drwxr-x---+ 1 hansc          hansc        0 Apr  1 13:01 2-stra-py\n']# b"Cloning into '1-tracealllines-py'...\n"# b"Cloning into '2-cygwinco-py'...\n"# b"Cloning into '3-cygwinco-py'...\n"# []# [b'Hello World!\n']# b'Salary and expenses are not equal\n'# [b'Salary and expenses are not equal\n']....