Python 巧用Popen和SteamCMD特性实现自动化
明确下载步骤:
打开steamcmd.exe ——> login anonymous (匿名登录) ——> workshop_download_item gameID modID (下载对应模组) ——> quit (退出)
根据这篇文章:Steam 控制台客户端 - Valve Developer Community (valvesoftware.com)
可知:想要在命令行执行多条命令只需在其前面加“+”即可
以上文发现为基础
from subprocess import Popen
currentPopen = Popen(
f'../steamcmd/steamcmd +login anonymous +workshop_download_item {gameID} {id} +quit',
encoding='utf-8',
stdin=PIPE,
stdout=PIPE,
)
此时该如何知道模组下载成功呢?
通过对steamcmd的观察了解,可知下载成功:默认在***'steamcmd / steamapps / workshop / content’文件夹下生成gameID / modID的文件夹名
所以只需在进程执行完毕后检查文件夹路径是否存在*即可
以下是代码为大致原理:
from os.path import exists,normpath
# BASEPATH 项目根目录
BASEMODINSTALL = '/steamcmd/steamapps/workshop/content'
while True:
sleep(0.6)
if currentPopen.poll() == 0: # Popen.poll() 正在运行返回 None 执行完毕返回 0
modPath = normpath(f'/{gameID}/{id}')
if exists(BASEPATH + BASEMODINSTALL + modPath):
print('下载成功')
else:
print('下载失败')
break
由于while会阻塞线程,可以通过多线程解决
from threading import Thread
def downloading(game_id,mod_id):
......
downloadingThread = Thread(target=downloading,arg=(gameID,modID,),daemon=True)
downloadingThread.start()
值得注意点是 Popen 在程序打包成exe时,会显示的弹出黑色命令行
解决方法:向Popen传入 creationflags=0x08000000 参数