20141123

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

 

posted @ 2014-11-23 21:44  草珊瑚  阅读(617)  评论(0编辑  收藏  举报