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

发布于 2024-12-06 10:44:42 字数 172 浏览 0 评论 0原文

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

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

@echo off

C:
chdir C:\cygwin\bin

bash --login -i

From a windows application written on C++ or python, how can I execute arbitrary shell commands?

My installation of Cygwin is normally launched from the following bat file:

@echo off

C:
chdir C:\cygwin\bin

bash --login -i

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

怪我太投入 2024-12-13 10:44:42

在 Python 中,使用 os.system、os.popen 或 subprocess 运行 bash 并传递适当的命令行参数。

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

From Python, run bash with os.system, os.popen or subprocess and pass the appropriate command-line arguments.

os.system(r'C:\cygwin\bin\bash --login -c "some bash commands"')
赠意 2024-12-13 10:44:42

以下函数将运行 Cygwin 的 Bash 程序,同时确保 bin 目录位于系统路径中,以便您可以访问非内置命令。这是使用登录 (-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]

The following function will run Cygwin's Bash program while making sure the bin directory is in the system path, so you have access to non-built-in commands. This is an alternative to using the login (-l) option, which may redirect you to your home directory.

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

Example use:

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]
二智少女猫性小仙女 2024-12-13 10:44:42

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

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

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

Bash should accept a command from args when using the -c flag:

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

Combine that with C++'s exec or python's os.system to run the command.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文