今天用python写了个快速启动的小工具。
只要对应好,命令和程序的路径,就可。
import json,os,win32api import subprocess from subprocess import Popen while True: program = input("请输入你常用的程序:") if program == "quit": print("good bye~~~") break json_file = open("cmdjson.json","r", encoding="utf-8") cmd_dict = json.load(json_file) for k, v in cmd_dict.items(): if program == k: # Popen有权限问题 # Popen(v) # os.system本来有空格问题,通过字符串引号包含即可 path = os.path.normcase(v) # os.system('"%s"' % path) win32api.ShellExecute(0,'open',path,'','',1) break else: print("找不到该程序")
{ "mp3": "F:/我的软件/娱乐工具/AIRPLAY.exe", "qq":"D:/Program Files (x86)/Tencent/QQ/QQProtect/Bin/QQProtect.exe", "dvd":"D:/Program Files (x86)/SPlayer/splayer.exe", "uc":"D:/Program Files/uc/UCBrowser/Application/UCBrowser.exe", "ps":"D:/Program Files/ps6/Adobe Photoshop CS6 (64 Bit)/Photoshop.exe", "chrome":"C:/Users/samwu/AppData/Local/Google/Chrome/Application/chrome.exe", "st3":"D:/Program Files (x86)/Sublime Text3/sublime_text.exe" }
坑是有的,就是python对json文件的解析,如果json文件里包括"\"这个斜杠,表示转义,就会解析错误,你要"\\"才可以正确解析。或者全部处理成反斜杠。
本来os.system也能解决问题,但是如果路径有空格,os.system就瞎了。
subprocess有个小问题就是,权限问题,但os.system是没有这个问题。subprocess还有个问题就是,如果目标不是win32程序就不能打开,但是os.system可以。
但是,为什么os.system对空格有偏见呢,因为命令行对把空格当作参数了的分隔符了,所以我们要用引号来包含路径就可以了。
但是os.system有程序挂起问题,即调用的程序,不释放进程,os.system这个代码就一直挂在那边,不能输入下个命令 。
20141201发现的权限解决方案:
因为python文件其实是通过cmd.exe来执行,我们只要找到cmd.exe,复制出来,用管理员方式来执行,就可以解决Popen的权限问题。
新建一个cmd快捷方式,右键-属性-兼容性-始终用管理员权限打开。
右键-属性-快捷方式下面的目标里面,添加/k python文件路径,例如C:\Users\samwu\Desktop\cmd\cmd.exe /k mycmd.py
这样就可以了。
但是这样不能解决Popen打开非win32程序的问题。
终极方案,
使用win32api.ShellExecute函数。
参考链接:http://www.cnblogs.com/TsengYuen/archive/2011/02/10/1951004.html
http://book.51cto.com/art/200710/58178.htm
http://sourceforge.net/projects/pywin32/files/pywin32/
----------------------------20141208----------------
今天增加了字符串相似度判断
import json,os,win32api import win32con,win32gui,win32api,win32com.client import time def similarity_str(s1, s2): str_temp = zip(s1, s2) similarity = 0 s1_length = len(s1) for zip_temp in str_temp: if zip_temp[0] == zip_temp[1]: similarity += 1 return similarity / s1_length def youdao_fn(str): # 获取窗口句柄 dlg = win32gui.FindWindow(None, '有道词典') # 显示窗口 # win32con.SW_RESTORE 是原来大小 # win32con.SW_MAXIMIZE 是最大化 win32gui.ShowWindow(dlg, win32con.SW_MAXIMIZE) # 将窗口显示在最前端 win32gui.SetForegroundWindow(dlg) # 模拟单个字符输入 # win32api.keybd_event(85,0,0,0) # 模拟字符串输入 time.sleep(0.2) shell = win32com.client.Dispatch("WScript.Shell") shell.SendKeys(str) def main_twoArgs(): while True: program = input("请输入你常用的程序:") if program == "": continue program_arr = (program+" ").split(" ") if len(program_arr) == 1: program_arr[1] = "" if program[0] == "quit": print("good bye~~~") break json_file = open("cmdjson.json","r", encoding="utf-8") cmd_dict = json.load(json_file) json_file.close() for k, v in cmd_dict.items(): if program_arr[0] == k: path = os.path.normcase(v) try: # 防止异常发生时,整个程序崩溃 win32api.ShellExecute(0,'open',path,program_arr[1],'',1) except: print("") if k == "dict" and program_arr[1] != "": youdao_fn(program_arr[1]) break else: if similarity_str(program_arr[0], k) > 0.1: print("你要输入的是这个命令吗?" + k) else: print("找不到该程序") def main_oneArgs(): while True: program = input("请输入你常用的程序:") if program == "quit": print("good bye~~~") break json_file = open("cmdjson.json","r", encoding="utf-8") cmd_dict = json.load(json_file) json_file.close() for k, v in cmd_dict.items(): if program == k: path = os.path.normcase(v) win32api.ShellExecute(0,'open',path,'','',1) break else: if similarity_str(program, k) > 0.5: print("你要输入的是这个命令吗?" + k) break else: print("找不到该程序") main_twoArgs()