将CMD风格的参数传递给Python中的命令 | 将PowerShell函数转换为Python 3,但我找不到易于理解的答案。

25 浏览
0 Comments

将CMD风格的参数传递给Python中的命令 | 将PowerShell函数转换为Python 3,但我找不到易于理解的答案。

通过一个已经安装了并且在路径中的 PowerShell 脚本,我试图执行一个可执行文件(如果这有关系的话,它是 .net 的)……但是出于某种原因,我无法在命令窗口中显示 STDOUT。

nuget install mdoc -OutputDirectory packages -ExcludeVersion
start-process "packages/mdoc/tools/mdoc.exe" "--version"
echo "done"

这应该输出 mdoc 5.7.2(在发布这篇文章时,当前版本)。但你会看到 nuget 的输出,然后是 done

你对为什么没有显示出来有什么想法吗?

0
0 Comments

问题:如何将CMD风格的参数传递给Python中的命令,并将PowerShell函数转换为Python 3?

原因:在Windows上,默认情况下,使用Start-Process在新的控制台窗口中异步运行控制台程序。如果该程序很快完成,你可能只会看到新的控制台窗口闪烁一下,然后很快打开和关闭,或者你可能完全错过闪烁 - 无论哪种方式,其输出都不会显示在调用程序的控制台窗口中。使用- Wait参数可以使调用同步进行,并使用-NoNewWindow参数使其在同一个控制台中运行,但调用的PowerShell会话无法捕获或重定向所调用程序的输出。

解决方法:如果要同步运行控制台程序,并将其标准流连接到PowerShell的流,请不要使用Start-Process,而是直接调用该程序。如果外部程序的路径/名称必须带引号(因为其路径包含空格)和/或它存储在变量中,则可以使用&运算符进行调用。使用直接调用方法可以获得以下功能:同步执行,默认情况下捕获和/或重定向所调用程序的标准输出和标准错误流,可通过PowerShell的自动变量$LASTEXITCODE访问程序的进程退出代码。

所以解决方法是将CMD风格的参数传递给Python中的命令,可以直接调用该命令,并使用&运算符将其与参数一起传递。这样可以同步运行命令,并可以捕获和重定向其输出。在Windows PowerShell中,可以使用$LASTEXITCODE变量访问命令的退出代码。

在代码中,可以使用以下形式来调用外部程序:

& "packages/mdoc/tools/mdoc.exe" --version

如果外部程序的路径/名称必须带引号(因为其路径包含空格)和/或它存储在变量中,可以使用以下形式进行调用:

$exePath = "packages/mdoc/tools/mdoc.exe"
& $exePath --version

使用直接调用方法可以实现同步执行,默认情况下捕获和/或重定向所调用程序的标准输出和标准错误流。可以通过PowerShell的$LASTEXITCODE变量访问程序的进程退出代码。在代码中,可以通过以下形式将所有步骤组合起来:

nuget install mdoc -OutputDirectory packages -ExcludeVersion
$exePath = "packages/mdoc/tools/mdoc.exe"
& $exePath --version
"done"

如果要捕获外部程序的标准输出和标准错误输出,可以将调用赋值给一个变量,并使用重定向2>&1来捕获标准错误输出。注意要将捕获的标准错误输出转换为字符串数组,以便能够正确处理它们。如下所示:

$version = & $exePath --version  # $version receives stdout output as an *array of lines*

[string[]] $allOutput = & $exePath --version 2>&1

注意:当PowerShell与外部程序通信时,会涉及字符编码问题。

要将CMD风格的参数传递给Python中的命令,并将PowerShell函数转换为Python 3,可以使用直接调用方法,并使用&运算符将命令与参数一起传递。这样可以同步运行命令,并可以捕获和重定向其输出。在Windows PowerShell中,可以使用$LASTEXITCODE变量访问命令的退出代码。

0