运行 带有 subprocess.call 的批处理文件不起作用并冻结 IPython 控制台

Running batch file with subprocess.call does not work and freezes IPython console

这是一个常见问题,但阅读其他线程并没有解决我的问题。 我提供了完整路径以确保我没有犯任何路径公式错误。

import subprocess    
# create batch script
myBat = open(r'.\Test.bat','w+') # create file with writing access
myBat.write('''echo hello
pause''') # write commands to file
myBat.close()

现在我尝试了 运行通过三种不同的方式进行设置,在 SO 上找到了它们。在每种情况下,我的 IDE Spyder 都会进入忙碌模式并且控制台会冻结。没有终端 window 弹出或任何东西,没有任何反应。

subprocess.call([r'C:\Users\felix\folders\Batch_Script\Test.bat'], shell=True)


subprocess.Popen([r'C:\Users\felix\folders\Batch_Script\Test.bat'], creationflags=subprocess.CREATE_NEW_CONSOLE)


p = subprocess.Popen("Test.bat", cwd=r"C:\Users\felix\folders\Batch_Script\")
stdout, stderr = p.communicate()

每个都是 运行,有和没有 shell=True 设置,也有和没有原始字符串、单反斜杠等。你能看出为什么这行不通吗?

嘿,我已经解决了你的问题:)

不要使用 subprocess 而是使用 os

示例:

import os
myBatchFile = f"{start /max} + yourFile.bat"
os.system(myBatchFile)
# "start /max" will run your batch file in new window in fullscreen mode

如有帮助请稍后致谢:)

  1. 你应该使用 with open()...

    with open(r'.\Test.bat','w+') 作为 myBat: myBat.write('echo hello\npause') # 将命令写入文件

  2. 我测试了 ide 的这一行 outside(通过 cmd 中的 运行),它会打开一个新的 cmd window

    subprocess.Popen([r'Test.bat'], creationflags=subprocess.CREATE_NEW_CONSOLE)

Spyder 并不总是能正确处理标准流,所以当您使用 subprocess.call 时看不到任何输出并不让我感到惊讶,因为它通常 运行 在同一个控制台中。这也解释了为什么它在外部 cmd 提示符下执行时对您有用。

如果您想继续使用 spyder 终端,但要为您的 bat 脚本调用一个新的 window

,您应该使用以下内容

subprocess.call(["start", "test.bat"], shell=True)

start 启动一个单独的命令提示符 window 到 运行 指定的程序或命令。您需要 shell=True 因为它是内置的 cmd 而不是程序本身。然后您可以像往常一样将您的 bat 文件传递​​给它。