鱼C论坛

 找回密码
 立即注册
查看: 3865|回复: 21

[已解决]python运行bat文件想要命令提示符弹出怎么办

[复制链接]
发表于 2023-3-9 17:20:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码跑通啦,但是有个小问题,python运行bat程序不弹出cmd的框,没办法知道什么时候才算完结果,每次都是自己盯着文件夹看有没有particle文件出现
求大佬指点一下,感谢感谢!!!!
 import subprocess
        import os
        if __name__ == '__main__':
            bat_path = r'E:/DualSPHysics_v5.0.5/DualSPHysics_v5.0/examples/inletoutlet/0_inlet+dem/wCaseIn_win64_CPU.bat'
            process = subprocess.Popen(bat_path, creationflags=subprocess.CREATE_NEW_CONSOLE, cwd=os.path.dirname(bat_path))
最佳答案
2023-3-10 11:59:19
本帖最后由 isdkz 于 2023-3-10 13:18 编辑
123lqqq 发表于 2023-3-10 11:00
imgse.com/album/5nBxf
啊第一张是代码的截图,第二章是弹出来的面板,第三步是按了计算调用了bat结果文 ...


在 Spyder 中,subprocess在默认情况下似乎无法正常使用creationflags参数来创建新的控制台窗口。

这是由于Spyder本身使用了Qt库来创建GUI,因此它会处理标准输出和标准错误流。

因此,如果使用subprocess在Spyder中调用另一个控制台程序,则该程序的输出可能不会显示在控制台中。

如果您需要在Spyder中运行控制台程序并查看其输出,则可以尝试使用QProcess类。

QProcess类是Qt中的进程控制类,与subprocess类似,但是它与Qt的GUI集成更好。

所以有以下解决办法:

第一个办法:不使用 spyder 运行,比如直接在控制台用 python xxx.py 的方式运行

第二个办法:在设置中修改 spyder 运行使用的默认控制台

微信图片编辑_20230310115455.jpg

截图20230310115709.png

第三个办法:使用 QProcess,不使用 subprocess,

示例代码:
import sys
import os
from PyQt5.QtCore import QProcess


bat_file = 'C:/test/test.bat'                                                                               # 这里改成你自己的 bat 文件的路径
cwd = os.path.dirname(bat_file).replace("/", "\\")

# 在Windows中启动新的控制台窗口,并在其中运行bat文件
if sys.platform == 'win32':
    process = QProcess()
    process.startDetached(
        f'cmd /c start /D {cwd} {bat_file}'
    )
else:
    process = QProcess()
    process.setWorkingDirectory(os.path.dirname(bat_file))
    process.start(f'{bat_file}')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-9 17:43:09 | 显示全部楼层
不应该没有弹出来吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-9 17:50:59 | 显示全部楼层
本帖最后由 dolly_yos2 于 2023-3-9 22:53 编辑

和楼主的实际需求并不相同,仅作一点讨论:如果这个 Python 脚本运行的唯一工作就是运行一个 bat 脚本然后结束,那为直接运行 bat 脚本可能效果更佳,毕竟没有中间商赚差价。
如果仍然是只运行一个脚本就结束,又必须使用 Python 启动,可以用 os.execl 来完成,效率应该会更高一点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-9 17:52:49 From FishC Mobile | 显示全部楼层
dolly_yos2 发表于 2023-3-9 17:50
代码写成这样真的很让人感到匪夷所思
这个 Python 脚本运行的唯一工作就是运行一个 bat 脚本然后结束,那 ...

最近一直在研究bat
发现最原始的脚本也能完成狠nb的功能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-9 19:06:16 | 显示全部楼层
dolly_yos2 发表于 2023-3-9 17:50
代码写成这样真的很让人感到匪夷所思
这个 Python 脚本运行的唯一工作就是运行一个 bat 脚本然后结束,那 ...

好的谢谢啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-9 19:08:58 | 显示全部楼层
isdkz 发表于 2023-3-9 17:43
不应该没有弹出来吧

昂我也不知道为什么没弹出,有时候粒子布多了要算很久,我也不知道啥时候结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-9 19:16:53 | 显示全部楼层
dolly_yos2 发表于 2023-3-9 17:50
代码写成这样真的很让人感到匪夷所思
这个 Python 脚本运行的唯一工作就是运行一个 bat 脚本然后结束,那 ...

啊因为要做个可视化页面,计算那一步要调这个bat文件,代码确实很烂,以后还要和大佬们多多学习。阁下的感到和匪夷所思语义重复了,只用说让人匪夷所思就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-9 22:26:10 | 显示全部楼层
isdkz 发表于 2023-3-9 17:43
不应该没有弹出来吧

我在想有什么办法可以显示bat文件已经算完了,或者bat的代码改成python的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-9 22:30:08 | 显示全部楼层
123lqqq 发表于 2023-3-9 22:26
我在想有什么办法可以显示bat文件已经算完了,或者bat的代码改成python的代码

这个不可能运行没有弹出 cmd 呀,可能还是你的 bat 脚本的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-9 22:34:10 | 显示全部楼层
wp231957 发表于 2023-3-9 17:52
最近一直在研究bat
发现最原始的脚本也能完成狠nb的功能

正是如此,bash/cmd 是非常强大和方便的,而 Python 则有些过于强大了
不过到了现在可能还是更推荐 PowerShell 吧,cmd 确实已经比较古老了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-9 22:40:19 | 显示全部楼层
isdkz 发表于 2023-3-9 22:30
这个不可能运行没有弹出 cmd 呀,可能还是你的 bat 脚本的问题

啊!!!为什么!!!咆哮!!!啊啊啊啊啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-9 22:46:28 | 显示全部楼层
123lqqq 发表于 2023-3-9 22:40
啊!!!为什么!!!咆哮!!!啊啊啊啊啊

截个图看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-9 22:50:21 | 显示全部楼层
123lqqq 发表于 2023-3-9 19:16
啊因为要做个可视化页面,计算那一步要调这个bat文件,代码确实很烂,以后还要和大佬们多多学习。阁下的 ...


感谢指出!从您描述的情况看这样设计也是有一定道理的。
我测试了一下是能够正常创建新终端窗口(不太确定这一名词是否准确)的,如果您那边遇到了问题,且需求本质上是要能够显示是否已经完成了计算,且 bat 脚本在运算完成后将会自动退出,那么可以使用 subprocess.Popen 类型的 wait 方法来等待脚本运行结束,比如
import subprocess
import os
if __name__ == '__main__':
        bat_path = r'E:/DualSPHysics_v5.0.5/DualSPHysics_v5.0/examples/inletoutlet/0_inlet+dem/wCaseIn_win64_CPU.bat'
        process = subprocess.Popen(bat_path, creationflags=subprocess.CREATE_NEW_CONSOLE, cwd=os.path.dirname(bat_path)).wait()
        print("Done!")
https://docs.python.org/3/librar ... bprocess.Popen.wait
可以使用 returncode 属性来判断是否正常结束:https://docs.python.org/3/librar ... ss.Popen.returncode
注意这里的 wait 是通过忙等待实现的,如果这一特性不可接受可以按照文档中的推荐使用 asyncio.create_subprocess_exec 和相关的类似方法实现:https://docs.python.org/3/librar ... ate_subprocess_exec
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-10 10:14:38 | 显示全部楼层
dolly_yos2 发表于 2023-3-9 22:50
感谢指出!从您描述的情况看这样设计也是有一定道理的。
我测试了一下是能够正常创建新终端窗口(不太 ...

好的!感谢感谢!!!!!!谢谢谢谢谢谢谢谢谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-10 11:00:05 | 显示全部楼层

imgse.com/album/5nBxf
啊第一张是代码的截图,第二章是弹出来的面板,第三步是按了计算调用了bat结果文件也生成了,但是没有弹命令提示符谢谢您!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-10 11:59:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2023-3-10 13:18 编辑
123lqqq 发表于 2023-3-10 11:00
imgse.com/album/5nBxf
啊第一张是代码的截图,第二章是弹出来的面板,第三步是按了计算调用了bat结果文 ...


在 Spyder 中,subprocess在默认情况下似乎无法正常使用creationflags参数来创建新的控制台窗口。

这是由于Spyder本身使用了Qt库来创建GUI,因此它会处理标准输出和标准错误流。

因此,如果使用subprocess在Spyder中调用另一个控制台程序,则该程序的输出可能不会显示在控制台中。

如果您需要在Spyder中运行控制台程序并查看其输出,则可以尝试使用QProcess类。

QProcess类是Qt中的进程控制类,与subprocess类似,但是它与Qt的GUI集成更好。

所以有以下解决办法:

第一个办法:不使用 spyder 运行,比如直接在控制台用 python xxx.py 的方式运行

第二个办法:在设置中修改 spyder 运行使用的默认控制台

微信图片编辑_20230310115455.jpg

截图20230310115709.png

第三个办法:使用 QProcess,不使用 subprocess,

示例代码:
import sys
import os
from PyQt5.QtCore import QProcess


bat_file = 'C:/test/test.bat'                                                                               # 这里改成你自己的 bat 文件的路径
cwd = os.path.dirname(bat_file).replace("/", "\\")

# 在Windows中启动新的控制台窗口,并在其中运行bat文件
if sys.platform == 'win32':
    process = QProcess()
    process.startDetached(
        f'cmd /c start /D {cwd} {bat_file}'
    )
else:
    process = QProcess()
    process.setWorkingDirectory(os.path.dirname(bat_file))
    process.start(f'{bat_file}')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-3-10 12:05:33 | 显示全部楼层
isdkz 发表于 2023-3-10 11:59
在 Spyder 中,subprocess在默认情况下似乎无法正常使用creationflags参数来创建新的控制台窗口。

这 ...

为了解决你的问题我还去装了个 spyder,要个最佳答案不过分吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-10 12:06:47 | 显示全部楼层
isdkz 发表于 2023-3-10 11:59
在 Spyder 中,subprocess在默认情况下似乎无法正常使用creationflags参数来创建新的控制台窗口。

这 ...

大佬,你是我的神!!!我可以请你喝个奶茶啥的吗,真的太感谢你了!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-10 12:08:44 | 显示全部楼层
123lqqq 发表于 2023-3-10 12:06
大佬,你是我的神!!!我可以请你喝个奶茶啥的吗,真的太感谢你了!!!!

不用不用,太客气啦,给个最佳答案就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-10 12:25:57 | 显示全部楼层
isdkz 发表于 2023-3-10 12:08
不用不用,太客气啦,给个最佳答案就行

啊!你直接把收款码给我,这样可以吗!真的很谢谢你,也只是请您喝点东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-24 07:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表