从另一个应用程序在Cygwin中运行bash命令

时间:2011-09-22 10:13:53

标签: c++ python windows cygwin

从用C ++或python编写的Windows应用程序,我如何执行任意shell命令?

我的Cygwin安装通常是从以下bat文件启动的:

@echo off

C:
chdir C:\cygwin\bin

bash --login -i

3 个答案:

答案 0 :(得分:5)

在Python中,使用os.systemos.popensubprocess运行bash并传递相应的命令行参数。

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

答案 1 :(得分:2)

以下函数将运行Cygwin的Bash程序,同时确保bin目录位于系统路径中,因此您可以访问非内置命令。这是使用login(-l)选项的替代方法,该选项可能会将您重定向到您的主目录。

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()

使用示例:

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]

答案 2 :(得分:1)

Bash应该在使用-c标志时接受来自args的命令:

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

将它与C ++的exec或python的os.system相结合来运行命令。