6

更新:当我使用subprocess.call而不是subprocess.Popen,问题就解决了——有人知道是什么原因吗?还有另一个问题:我似乎找不到控制输出的方法......有没有办法将输出重定向subprocess.call到字符串或类似的东西?谢谢!

我正在尝试使用Devenv来构建项目,当我在命令提示符下键入它时它运行得很好devenv A.sln /build "Debug|Win32"- 但是当我使用 python 使用与上面相同的行来运行它时,它什么也不显示Popen(cmd,shell=true)cmd如果我删除|,将其更改为"Debug"only,它可以工作....

有人知道为什么会这样吗?我试过放一个\before |,但仍然没有发生任何事情..

这是我正在使用的代码:

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,它可以完美地工作..

感谢这里的每一条评论

4

5 回答 5

5

devenv.exe和之间有区别devenv.com,两者都是可执行的并且位于同一个目录中(叹气)。问题中使用的命令行和一些答案没有说明他们想要哪个,所以我不确定哪个会被使用。

如果你想从命令行调用,那么你需要确保你使用devenv.com,否则你可能会弹出一个 GUI。我认为这可能是一些(但不是全部)混乱的原因。

于 2009-07-09T16:34:56.673 回答
1

请参阅第 17.1.5.1 节。在 python 文档中。

在 Windows 上,Python 自动在项目配置参数周围添加双引号,即 Debug|win32 作为“Debug|win32”传递给 devenv。您不需要添加双引号,也不需要将 shell=True 传递给 Popen。

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

于 2011-12-08T22:00:24.133 回答
0

尝试双引号,例如:'devenv A.sln /build "Debug|Win32"'

于 2009-06-26T15:35:30.837 回答
0

看起来 Windows 的 shell 将其|作为管道(尽管有引号和转义)。你试过shell=False吗?

于 2009-06-26T15:36:43.377 回答
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
于 2009-07-05T19:02:02.600 回答