当python子命令.Popen调用不同目录下的脚本时,cmd.exe会弹出新窗口。

问题描述 投票:1回答:1

需要做哪些具体的语法修改或配置修改,才能使下面调用Python 3.7.7脚本的整个输出从 cmd.exe 在Windows 10中,将被输出到相同的单一的 CMD.exe 窗口?

下面的问题是,最底层的脚本( someCommand.py )会触发它自己的控制台窗口,以启动它的输出,然后在它运行完毕后立即关闭,这样最低级别脚本( someCommand.py )没有返回到 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的目录,这也是调用到 topLevelScript.py 是由 cmd.exe 以上。 的内容。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 将以同样的方式打印 cmd.exe 控制台窗口,调用上级的父级 topLevelScript.pysharedFunctions.py 程式?


@Gerrat的建议

根据 @Gerrat 的建议,我把下面的 subprocess.Popen(...) 行改为如下。

mycommand = workingDir+scriptName
cp = subprocess.run(mycommand, shell=True, check=True, capture_output=True, universal_newlines=True)
print(cp.stdout)

但我仍然看到同样的问题,即为最低级别的脚本创建和销毁一个新的控制台窗口,而没有将它的任何输出传递给持久调用窗口。

python python-3.x cmd subprocess popen
1个回答
0
投票

鉴于 subprocess.run 返回一个 已完成流程我觉得你可以把 someCommand.py 以下是:

cp = subprocess.run("some cli command", shell=True, check=True, capture_output=True, universal_newlines=True)
print(cp.stdout)
© www.soinside.com 2019 - 2024. All rights reserved.