当我编写Python脚本以“Debug|Win32”配置运行Devenv时,它没有任何反应

6 投票
5 回答
3283 浏览
提问于 2025-04-15 12:31

更新:当我用 subprocess.call 代替 subprocess.Popen 时,问题解决了——有没有人知道这是为什么?然后又出现了另一个问题:我似乎找不到控制输出的方法……有没有办法把 subprocess.call 的输出重定向到一个字符串或者其他地方?谢谢!

我正在尝试使用 Devenv 来构建项目,当我在命令提示符中输入 devenv A.sln /build "Debug|Win32" 时,它运行得很好——但是当我用 Python 通过 Popen(cmd,shell=true) 来运行它,cmd 是上面相同的命令时,它什么都不显示。如果我去掉 |,只改成 "Debug",就可以正常工作……

有没有人知道这是为什么?我试着在 | 前面加了一个 \,但还是没有任何反应……

这是我使用的代码:

from subprocess import Popen, PIPE

cmd = ' "C:\\Program Files\\Microsoft Visual Studio 8\\Common7\\IDE\\devenv" solution.sln /build "Debug|Win32" '

sys.stdout.flush()
p = Popen(cmd,shell=True,stdout=PIPE,stderr=PIPE)
lines = []
for line in p.stdout.readlines():
    lines.append(line)
out = string.join(lines)
print out
if out.strip():
    print out.strip('\n')
    sys.stdout.flush()

……不过,如果我把 Debug|Win32 换成 Debug,就能完美运行……

感谢这里的每一个评论

5 个回答

1

请查看Python文档中的第17.1.5.1节。

在Windows系统上,Python会自动在项目配置参数周围加上双引号,也就是说像Debug|win32这样的参数会被传递为"Debug|win32"给devenv。你不需要手动加双引号,也不需要在Popen中使用shell=True。

可以使用ProcMon工具查看传递给devenv的参数字符串。

5

devenv.exedevenv.com 之间是有区别的,这两个都是可以执行的程序,而且它们在同一个文件夹里(真让人无奈)。在问题和一些回答中使用的命令行没有说明具体要用哪个,所以我不太确定会用到哪个。

如果你想从命令行调用的话,确保使用 devenv.com,否则你很可能会看到一个图形界面弹出来。我觉得这可能是造成一些(但不是全部)困惑的原因。

0

当你使用 shell = False 时,程序会把你输入的字符串当作一个完整的命令来处理。这时候,你需要把命令和参数放在一个列表里,也就是像这样:

from subprocess import Popen, PIPE

cmd = [
    r"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv", # in raw r"blah" string, you don't need to escape backslashes
    "solution.sln",
    "/build",
    "Debug|Win32"
]

p = Popen(cmd, stdout=PIPE, stderr=PIPE)
out = p.stdout.read() # reads full output into string, including line breaks

print out

撰写回答