今天用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()
文章列表