【问题标题】:Python, subprocess, devenv, why no output?Python,子进程,devenv,为什么没有输出?
【发布时间】:2009-10-06 13:46:06
【问题描述】:

我从 Python 脚本构建了一个 Visual Studio 解决方案。一切都很好,除了我无法捕获构建输出。

p = subprocess.Popen(['devenv', 'solution.sln', '/build'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(out, err) = p.communicate()
ret = p.returncode

在这里,outerr 始终为空。无论在p.returncode 中看到的构建是否成功,都会发生这种情况。

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

    将其从“devenv”更改为“devenv.com”。显然 Popen 首先查找 .EXE,但外壳程序首先查找 .COM。切换到“devenv.com”对我有用。

    对于增量构建,devenv 明显快于 msbuild。我刚刚使用最新项目进行了构建,这意味着什么都不会发生。

    devenv 23 秒 msbuild 55 秒。

    【讨论】:

    • 我相信速度差异在于devenv 默认为并行构建,而 MSBuild 不是。试试msbuild /m,你应该会看到类似的速度。
    • devenv.com 的 +1。这对我有用。 MSBUILD 不适用于 VS 2010。
    【解决方案2】:

    您应该改用msbuild.exe 构建解决方案,它旨在向stdout 和stderr 提供反馈。 msbuild.exe位于

    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\msbuild.exe(构建VS2005解决方案) 或C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe(构建VS2008解决方案)

    请注意,msbuild.exe 不像 devenv.exe 那样采用 /build 开关。

    【讨论】:

    • 我知道这是一个问题,但我想我会为了他人的利益对此发表评论。是的,您可以使用 msbuild 完成此操作,它是一个非常好的工具。但是,如果您有构建 VS 设置项目的解决方案,则 msbuild 不会构建这些项目。我有 python 脚本来构建我的一些解决方案,然后将设置分发到服务器和我自己的存档,但我无法使用 msbuild。我将尝试 devenv.com,看看我是否可以这样得到错误,我认为这对我和我的情况来说是理想的。
    【解决方案3】:

    这可能是因为您正在运行的软件没有写入stdoutstderr。也许是writes directly to the terminal/console

    如果是这种情况,您将需要一些 win32 api calls 来捕获输出。

    【讨论】:

    • 在这种情况下,当我运行我的脚本时,我会不会在屏幕上看到构建输出?
    • @Gilad:我不知道。也许你必须自己打印回来。
    • 如果您想捕获输出,您可以使用 /out 标志并在其后添加日志文件路径。然后将构建事件记录到该文件中。
    【解决方案4】:

    可能您的问题与管道缓冲区已满相同。查看this question 以获得好的答案。

    【讨论】:

    • 不,这种情况下的问题是挂起,解决方案是使用 p.communicate()。 OP 没有遇到挂起,并且已经使用 p.communicate()。
    猜你喜欢
    • 2016-11-19
    • 1970-01-01
    • 2012-06-18
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多