zoukankan      html  css  js  c++  java
  • 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:UserssamwuDesktopcmdcmd.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()
  • 相关阅读:
    [转载]TFS测试管理
    [转载]TFS发送邮件提醒功能
    [转载]TFS与Project、Excel同步
    [转载]TFS源代码管理8大注意事项
    [转载]TFS源代码管理
    [转载]项目风险管理七种武器之结语
    [转载]项目风险管理七种武器-拳头
    刷新SqlServer所有视图元数据的存储过程
    MSSQL 触发器 暂停 和 启动
    给 Easyui Datagrid 扩展方法
  • 原文地址:https://www.cnblogs.com/samwu/p/4117521.html
Copyright © 2011-2022 走看看