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.pytopLevelScript.py 位于同一目录中,这也是上面cmd.exetopLevelScript.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.pysharedFunctions.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弹出新窗口的主要内容,如果未能解决你的问题,请参考以下文章

python 调用DLL的问题

azkaban怎么在job里面直接调用python脚本啊,我调用shell脚本正常运行,调用python脚本没有运行

C# 如何调用Python文件

python获取上层方法调用

怎样用python调用dll

怎么在java的flink中调用python程序?