首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用subprocess.call运行批处理文件不能工作,并冻结IPython控制台。

使用subprocess.call运行批处理文件不能工作,并冻结IPython控制台。
EN

Stack Overflow用户
提问于 2021-12-01 19:06:26
回答 3查看 1.1K关注 0票数 0

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

代码语言:javascript
运行
复制
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都会进入繁忙模式,控制台就会冻结。没有弹出终端窗口什么的什么都没发生。

代码语言:javascript
运行
复制
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设置,也有和不带原始字符串、单个反斜杠等等。你能看出为什么这个不起作用吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-01 20:16:14

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

如果您想继续使用spyder终端,但要为bat脚本调用一个新窗口,则应该使用以下内容

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

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

票数 3
EN

Stack Overflow用户

发布于 2021-12-01 19:18:46

嘿,我有办法解决你的问题:)

不要使用subprocess,而是使用os

例子:

代码语言:javascript
运行
复制
import os
myBatchFile = f"{start /max} + yourFile.bat"
os.system(myBatchFile)
# "start /max" will run your batch file in new window in fullscreen mode

(如果有帮助的话,请稍后谢谢我:)

票数 0
EN

Stack Overflow用户

发布于 2021-12-01 19:34:01

  1. 应该与open()一起使用..。

使用open(r'.\Test.bat','w+')作为myBat: myBat.write('echo hello\n‘)#file命令来文件

  1. I在ide之外测试了这一行(通过在cmd中运行),它将打开一个新的cmd窗口

creationflags=subprocess.CREATE_NEW_CONSOLE) subprocess.Popen(r'Test.bat‘)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70189890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档