0

我正在尝试运行 bash.exe(Windows 上的 Ubuntu 上的 Bash)作为 Sublime Text 的构建命令。但是,bash.exe 有一个错误,不支持将其标准输出输出到任何管道。

问题是这样的:如何运行 cmd 行(即“bash.exe -c ls”)并捕获输出,而无需将 bash.exe 输出到 Windows 上的管道中?

我愿意在 Windows 上使用任何语言或环境来制作这个工具。

编辑

我跑了 bashTest = subprocess.Popen(["bash.exe", "-c", "ls"]), stdout=subproccess.PIPE)

这产生了:

bashTest.communicate()[0] b'E\x00r\x00r\x00o\x00r\x00:\x00\x000\x00x\x008\x000\x000\x007\x000\x000\x005\x007\x00\r\x00\r\x00\n\x00'

4

3 回答 3

1

目前这是不可能的。有一个关于它的 github 问题,该问题已作为已知限制关闭。如果您想提高对它的认识,我看到了 2 个相关的用户语音想法:允许 Windows 程序生成 Bash允许本机 Win32 应用程序启动 Linux 工具/命令

但是,您可以通过多种方式破解它。一种方法是编写一个在 bash.exe 控制台中永远循环的脚本。当脚本收到信号时,它会运行 Linux 命令并将输出通过管道传输到文件,然后发出信号表明它已完成。这是一些伪代码:

Linux:

while true
  while not exists /mnt/c/dobuild
    sleep 1
  end
  gcc foo.c > /mnt/c/build.log
  rm /mnt/c/dobuild
end

视窗:

touch C:\dobuild
while exists C:\dobuild
  sleep 1
end
cat C:\build.log

这确实需要在脚本运行时始终打开 bash.exe 控制台,这并不理想。

已经提到的另一个潜在解决方法是使用ReadConsoleOutput

于 2016-09-06T19:44:47.803 回答
0

您需要使用该选项shell=True in Popen()才能使管道正常工作。

像这个例子不需要拆分这个命令。

>>> import subprocess as sp    
>>> cmd = 'echo "test" | cat'
>>> process = sp.Popen(cmd,stdout=sp.PIPE,shell=True)
>>> output = process.communicate()[0]
>>> print output
test
于 2016-09-05T07:24:49.253 回答
0

如果您等不及修复,您唯一现实的选择是使用ReadConsoleOutput和/或相关功能。

于 2016-09-06T01:56:38.000 回答