文章出處

今天用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()

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()