运行 带有 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
如有帮助请稍后致谢:)
你应该使用 with open()...
with open(r'.\Test.bat','w+') 作为 myBat:
myBat.write('echo hello\npause') # 将命令写入文件
我测试了 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 文件传递给它。
这是一个常见问题,但阅读其他线程并没有解决我的问题。 我提供了完整路径以确保我没有犯任何路径公式错误。
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
如有帮助请稍后致谢:)
你应该使用 with open()...
with open(r'.\Test.bat','w+') 作为 myBat: myBat.write('echo hello\npause') # 将命令写入文件
我测试了 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 文件传递给它。