这是一个常见的问题,但阅读其他线程并没有解决我的问题。我提供完整的路径以确保我没有犯任何路径设置错误。
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()现在我试着通过三种不同的方式运行它,发现它们都在这里。在每种情况下,我的IDE Spyder都会进入繁忙模式,控制台就会冻结。没有弹出终端窗口什么的什么都没发生。
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设置,也有和不带原始字符串、单个反斜杠等等。你能看出为什么这个不起作用吗?
发布于 2021-12-01 20:16:14
Spyder并不总是正确地处理标准流,所以在使用subprocess.call时没有看到任何输出,这并不让我感到惊讶,因为它通常运行在同一个控制台中。这也解释了为什么在外部cmd提示符中执行时它确实对您有效。
如果您想继续使用spyder终端,但要为bat脚本调用一个新窗口,则应该使用以下内容
subprocess.call(["start", "test.bat"], shell=True)
start启动一个单独的命令提示符窗口来运行指定的程序或命令。您需要shell=True,因为它是内置的cmd,而不是程序本身。然后,您可以将其传递给您的bat文件。
发布于 2021-12-01 19:18:46
嘿,我有办法解决你的问题:)
不要使用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(如果有帮助的话,请稍后谢谢我:)
发布于 2021-12-01 19:34:01
使用open(r'.\Test.bat','w+')作为myBat: myBat.write('echo hello\n‘)#file命令来文件
creationflags=subprocess.CREATE_NEW_CONSOLE) subprocess.Popen(r'Test.bat‘)
https://stackoverflow.com/questions/70189890
复制相似问题