python subcommand.Popen调用不同目录下的脚本时cmd.exe弹出新窗口
Posted
技术标签:
【中文标题】python subcommand.Popen调用不同目录下的脚本时cmd.exe弹出新窗口【英文标题】:cmd.exe pops up new window when python subcommand.Popen calls script in different directory 【发布时间】:2020-09-30 11:13:56 【问题描述】:需要进行哪些特定的语法更改或配置更改,以便从 Windows 10 中的 cmd.exe
调用下面的 Python 3.7.7 脚本的整个输出将输出到同一个 CMD.exe
窗口中?
下面的问题是最底层的脚本(someCommand.py
)会触发它自己的控制台窗口来启动它的输出,然后在运行完成后立即关闭,这样最底层的脚本(@ 987654324@ ) 不会返回到调用它的cmd.exe
控制台窗口。
高级调用命令
这是在cmd.exe
窗口中运行以调用高级脚本的命令:
python topLevelScript.py "firstInputsPath" "secondInputsPath"
高级命令调用的脚本
这里是topLevelScript.py
的内容
print("Inside topLevelScript.py script.")
import sys
import sharedFunctions as sharedfunc
pathToInputs1 = str(sys.argv[1])
pathToInputs2 = str(sys.argv[2])
pathToCalls = "C:\\some\\path\\"
commandToCalls = "someCommand.py"
print ('pathToInputs1:', pathToInputs1 )
print ('pathToInputs2:', pathToInputs2 )
sharedfunc.applyFoundation(commandToCalls, pathToCalls, pathToInputs1, pathToInputs2)
称为第二级的共享功能模块
sharedFunctions.py
与topLevelScript.py
位于同一目录中,这也是上面cmd.exe
对topLevelScript.py
的调用所在的同一目录。 sharedFunctions.py
的内容为:
import subprocess
def applyFoundation(scriptName, workingDir, inputs1Path, inputs2Path ):
print("Inside sharedFunctions.py script and applyFoundation(..., ...) function. ")
print ('inputs1Path:', inputs1Path )
print ('inputs2Path:', inputs2Path )
print("scriptName is: " +scriptName)
print("workingDir is: " +workingDir)
proc = subprocess.Popen( scriptName,cwd=workingDir,stdout=subprocess.PIPE, shell=True)
while True:
line = proc.stdout.readline()
if line:
thetext=line.decode('utf-8').rstrip('\r|\n')
decodedline=ansi_escape.sub('', thetext)
print(decodedline)
else:
break
最底层的脚本,错误地输出到新的 cmd.exe 窗口:
以上所有内容都在调用它的同一 cmd.exe
窗口中打印其控制台输出,除了上面的 subprocess.Popen(...)
命令的输出,它启动了以下 someCommand.py
并将其输出打印在一个新的子窗口中cmd.exe
窗口,它启动然后迅速销毁而不记录任何输出:
print("Inside someCommand.py script. ")
import os
import subprocess
subprocess.run("some cli command", shell=True, check=True)
请注意,someCommand.py
除了简单地被subprocess.Popen(...)
调用之外,还位于与两个调用脚本不同的路径/目录中
需要进行哪些具体更改,以便
someCommand.py
的输出将打印在调用更高级别父程序topLevelScript.py
和sharedFunctions.py
程序的同一cmd.exe
控制台窗口中?
@Gerrat 的建议
根据@Gerrat 下面的建议,我将subprocess.Popen(...)
行改为如下所示:
mycommand = workingDir+scriptName
cp = subprocess.run(mycommand, shell=True, check=True, capture_output=True, universal_newlines=True)
print(cp.stdout)
但是我仍然看到相同的问题,即为最低级别的脚本创建和销毁新的控制台窗口,而没有将其任何输出传递给持久调用窗口。
【问题讨论】:
【参考方案1】:鉴于subprocess.run
返回CompletedProcess,
我认为您可以将someCommand.py
更改如下:
cp = subprocess.run("some cli command", shell=True, check=True, capture_output=True, universal_newlines=True)
print(cp.stdout)
【讨论】:
我尝试了您的建议,并在 OP 结束时报告了结果。请注意,我必须添加工作目录参数。我还能尝试什么? 我可能没有理解您的问题,或者您可能没有理解我的建议。我不是说要改subprocess.Popen
,而是改你的subprocess.run
的签名:Lowest Level Script
以上是关于python subcommand.Popen调用不同目录下的脚本时cmd.exe弹出新窗口的主要内容,如果未能解决你的问题,请参考以下文章