python os.system() 执行bat超时问题,如何解决?

os.system()调用一个bat 文件,bat文件不会自动关闭。导致代码卡在os.system()这一行。

import os, time

def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False

for i in range(40):
    time.sleep(5)
    print(111)
    os.system(r"D:\login\%s.bat"%(i))
    print(222)

bat代码

taskkill /f /im steam.exe
F:
cd F:\Software\Steam
steam.exe -login 账号 密码 -applaunch 1063730
运行结果及报错内容

111 输出了
222 并没有输出

我想要达到的结果

希望可以 os.system 执行超过一段时间 自动跳过往下执行
或者这个bat文件执行完能自动关闭2


taskkill /f /im steam.exe
cd /d F:\Software\Steam
start steam.exe -login 账号 密码 -applaunch 1063730

用start启动stream,bat会继续执行并退出。

换个方式试试看?

import subprocess

from threading import Timer

kill = lambda process: process.kill()
cmd = ['ping', 'www.google.com']
ping = subprocess.Popen(
    cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

my_timer = Timer(5, kill, [ping])

try:
    my_timer.start()
    stdout, stderr = ping.communicate()
finally:
    my_timer.cancel()

可以通过subprocess获取执行脚本的输出,进而做下次的判断:
如何从 os.system() 获取输出? |

可以考虑改用 subprocess 这个库来实现
示例:

p = subprocess.Popen([‘your command’, 'params and options'])
try:
p.wait(my_timeout)
except subp.TimeoutExpired:
p.kill()

同时也可考虑
解题思路
1、加入pause命令
2、加入exit命令
3、加入提示input("请输入任意按键退出")

1.要么你修改bat文件,让它执行完能够关闭
2.要么别用os,改用subprocess,这样可以让它在后台运行,不阻塞