V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
JCZ2MkKb5S8ZX9pq
V2EX  ›  Python

快速使用 Python 小工具的方法请益

  •  
  •   JCZ2MkKb5S8ZX9pq · 2019-12-16 15:23:27 +08:00 via iPhone · 4709 次点击
    这是一个创建于 1585 天前的主题,其中的信息可能已经有所发展或是发生改变。

    期望目标

    • 直接在终端任何位置快速使用特定目录(假定 utility )中的 tool.py 文件。输入尽量短。
    • python tool.py arg1 arg2

    试过几个方法

    • 直接在 IDE 里跑。sublime 里 ctrl p 直接能找到当前目录下的文件,需要切换到那个根目录。
    • 加入环境变量。win 下 utility 放在网盘下,软链接到 python 那个目录下,D 盘不知道为啥不认,但只能 python -m utulity.tool args。
      直接把 utility 加到环境变量不知道为啥不认。而且终端直接看 set path 和 python 里看 sys.path 不一样。
    • 写 bat 转发。代码是短了,但增加一个 py 就要加对应的 bat。

    一时卡这儿了,大家给支支招吧。

    第 1 条附言  ·  2019-12-17 23:00:03 +08:00
    • 果然试下来alias是最方便的,记录一下操作方式。

    step 1

    • 建立一个bat文件,我就建在utility/alias.bat。
    @echo off
    doskey mytool = python "D:\Python\utility\tool.py" $*
    ...
    
    • 后面的这个 $* 好像就可以传参数了。

    step 2

    • 直接把以下内容存一个.reg,或者手动去注册表改一下。
    Windows Registry Editor Version 5.00
    
    [HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor]
    "AutoRun"="D:\Python\utility\alias.bat"
    
    • 这里指定下你自己bat的位置。
    • 然后重启下终端,就应该能认到了。
    • 调用方式就是 mytool arg1 arg2 这样。也可以跟py文件同名,我这里是为了易读区分了一下。
    • 我用了 google 那个 fire,直接传参数没啥问题。也可以自己写条件控制一下。
    30 条回复    2019-12-19 14:52:46 +08:00
    imn1
        1
    imn1  
       2019-12-16 15:57:15 +08:00   ❤️ 1
    1.alias
    2.bat/cmd
    3.lnk

    当然 1 最方便
    Vegetable
        2
    Vegetable  
       2019-12-16 16:10:17 +08:00
    alias 是最简单的,但是不太推荐,不那么好管理的感觉
    建立一个目录,加入 path,然后在这个目录里放.bat 是最好的办法.
    adekyou06
        3
    adekyou06  
       2019-12-16 19:09:07 +08:00
    我也有类似的问题。想给 WEB 框架做个脚手架。
    ClericPy
        4
    ClericPy  
       2019-12-16 20:35:05 +08:00
    alias 直接跳那个目录不好使么

    我 Windows 上一般常用的带 GUI 的随便打包个 exe 单文件的丢 Claunch 里就算了, 其它的, 大都不需要加参数, py 文件整个扔 Claunch 里(就跟双击一样, 双击以前魔改过注册表用的 py.exe 那个 Launcher, 至于 cwd 可以快捷方式里设置也可以 Claunch 里设置)

    带参数的这种, 随手一个 gui... Windows 上的终端, cmd 太渣, cmder 启动又太慢.

    至于你说的 python -m 方式, 丢到 site-packages 里不好用么, 我如果有你这种脚手架, 用半小时撸个通用的功能选择器 UI 也不费劲
    gwy15
        5
    gwy15  
       2019-12-16 20:37:50 +08:00   ❤️ 1
    如果常用,打包到 setup.py 里的 scripts 里面然后 setup.py install。这个默认就在 path 里面,就跟 flask 或者 gunicorn 这种命令一样,随处都可以运行还跨平台。

    另外如果要经常修改,用 setup.py develop
    JCZ2MkKb5S8ZX9pq
        6
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-12-16 21:54:21 +08:00 via iPhone
    @ClericPy 想要更快捷嘛,最好 listary 或者 alfred 这种,直接调出输入框,直接打命令一步到位的。
    打包 gui 的话,我其实写个自动打包 bat 的也行。
    ClericPy
        7
    ClericPy  
       2019-12-16 22:35:14 +08:00
    @JCZ2MkKb5S8ZX9pq #6 那俩已经弃用多年了... 后来 wox, 现在 utools...

    习惯问题, 就像你说的那些, 如果真有必要, 全局 ahk 也更省心还省资源, 年纪大了懒得折腾了
    JCZ2MkKb5S8ZX9pq
        8
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-12-16 23:14:09 +08:00 via iPhone
    @ClericPy 哈哈,我刚还问了个 ahk 的问题,想区分不同输入法,定义不同热键。

    win 上现在有 listary 的好的替代嘛?自动跳文件夹,ctrl g 跳文件夹,自定义快捷键,这三个我用得比较多。但它自定义快捷键还是有点简陋。
    ClericPy
        9
    ClericPy  
       2019-12-16 23:19:03 +08:00
    @JCZ2MkKb5S8ZX9pq #8 ahk 我现在用的少了, 就因为它 64 位那个 dll 在 python 调用的时候取不到变量... 32 位就好好的, 郁闷

    listary 当时我是因为 everything 养成习惯了(wox 调起), 所以用了没多久就删了, 操作习惯是硬伤, 就像我没法玩 Manjaro i3wm + vim 一样. 现在 utools 全家桶用着了, 不是说 wox 不好, 但我就是喜欢追新

    前几天折腾 Windows10 更新的三个 dll, 差点把系统弄脏了, 现在不折腾了
    JCZ2MkKb5S8ZX9pq
        10
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-12-16 23:23:01 +08:00 via iPhone
    @ClericPy 嗯,安全第一。前两天刚把 Mac 环境变量清空过一次,最好少碰这类的,万一玩坏了重装太麻烦。
    imycc
        11
    imycc  
       2019-12-16 23:57:23 +08:00
    win 的没试过,不过应该差不多。我在 linux 下是把个人写的一些脚本软链到 scripts 目录下,然后加到 PATH 里。只要加了可执行权限以及 shebang,在命令行下只需要直接输入名字就可以运行了。
    imycc
        12
    imycc  
       2019-12-17 00:08:25 +08:00
    刚试了下还是可以用的。例如 D 盘下创建一个 bin 目录,加到系统的环境变量 Path 里。
    目录下创建一个测试脚本 hello_py.py ,随便输出个 hello world。
    命令行里直接输入 hello_py.py ,就可以执行了,不需要写 python。
    JCZ2MkKb5S8ZX9pq
        13
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-12-17 02:34:21 +08:00 via iPhone
    @imycc
    我这边之前已经加了 path,试了下直接输入。
    tool 或 tool.py 都可以,但我默认打开 py 的是 ide,所以并没有运行,而是在 ide 打开 tool.py
    如果打开方式改为 python 也许可以,但参数不知道能不能带。

    另外如果输入 python tool.py 就不行,对环境变量的作用范围可能还有点没摸清。

    今天已经躺下了,明天再试。
    CallMeReznov
        14
    CallMeReznov  
       2019-12-17 08:57:21 +08:00
    linux 加个单独的 path
    windows 扔 windows 文件夹或者加 path 也有专门的管理软件
    还有可以编译成 EXE 扔到 windows 文件夹地下都可以.
    no1xsyzy
        15
    no1xsyzy  
       2019-12-17 13:53:07 +08:00   ❤️ 1
    @JCZ2MkKb5S8ZX9pq 第一个是交给 cmd 自身或者 powershell 自身来解析的,由它对第零个参量在 %PATH% 中寻找,找到后调用。但第一个参量 tool.py 就不是这样,而是原样传递给 python 程序。
    所以结果上来说自己手写一个启动器比较方便
    JCZ2MkKb5S8ZX9pq
        16
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-12-17 22:30:58 +08:00
    @imycc
    刚才试了下,貌似还是不行。
    直接运行可以,但传不了参数。

    把.py 文件的打开方式指向 python.exe ,然后直接输入 tool,就可以运行 tool.py
    但如果运行 tool arg1,这时候 sys.argv 只能打印出 tool.py 的绝对路径,这一个参数,arg1 是得不到的。
    我本来套了 google 那个 fire,那个也同样不行。

    同时 python tool.py 还是会提示找不到文件。
    JCZ2MkKb5S8ZX9pq
        17
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-12-17 22:34:11 +08:00
    @no1xsyzy 嗯,我理解你的意思了。
    但上面那楼,我直接写 tool arg1 的话,tool。py 为什么也得不到 arg1 呢?
    请麻烦再给解释一下。
    JCZ2MkKb5S8ZX9pq
        18
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-12-17 23:02:11 +08:00
    @adekyou06
    @ClericPy
    @imycc
    alias 好像挺方便的,具体请看 append 的部分,我详细写了下。
    JCZ2MkKb5S8ZX9pq
        19
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-12-17 23:04:15 +08:00
    @Vegetable
    append 了一下。
    alias 感觉还不错,对应的 bat 和那个 reg 都直接放 utility 里也可以一起 git。
    no1xsyzy
        20
    no1xsyzy  
       2019-12-18 09:28:31 +08:00
    @JCZ2MkKb5S8ZX9pq 你这个指向是怎么指向的?
    我怀疑是注册表里没带 %*,默认的像这样:
    ClericPy
        21
    ClericPy  
       2019-12-18 11:12:35 +08:00
    @JCZ2MkKb5S8ZX9pq #18 还好吧, 目前 utools 调用我平时写的 py 文件就足够了, 我写的基本不要参数, 要参数时候 pymsgbox 也够了, 用的习惯最好, 我是不喜欢调起终端, 一个大黑框老坑我...
    JCZ2MkKb5S8ZX9pq
        22
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-12-18 13:41:26 +08:00 via iPhone
    @ClericPy 我是 cmder 一直开着。我去看一眼 utools。
    ClericPy
        23
    ClericPy  
       2019-12-18 16:14:29 +08:00
    @JCZ2MkKb5S8ZX9pq #22 提到 cmder 有什么办法优化启动速度么, 我优化过加了 fast 参数, 才从 5 秒 变 2 秒, 但是我上一台电脑配置比这台低, 同样固态, 没这么慢呢

    感觉是 init.bat 不知道什么地方拖了后腿
    JCZ2MkKb5S8ZX9pq
        24
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-12-18 17:56:20 +08:00
    可以考虑直接用 cmd.exe ,就是在 cmder 的设置 /启动那里,直接选第一个 command line,这样就非常快。
    然后如果偶尔需要其它的 task 模式,ctrl+T 的时候手动选一下就行了。
    主要是看使用频度的取舍了。
    我如果用默认的 cmd::Cmder 那个,也要两三秒的。
    JCZ2MkKb5S8ZX9pq
        25
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-12-18 18:13:22 +08:00
    @ClericPy 另外我搜了下,有一些相关的讨论,好像是 emu console 里比较费时。
    https://github.com/cmderdev/cmder/issues/1122
    https://github.com/cmderdev/cmder/issues/2023

    我也没多研究这玩意儿,就是当成终端的替代品,稍微布局好一点而已。
    也许这玩意儿跟 tmux 一样,应该就搞起一个 session 然后都在里面折腾,而不是建 N 个 session,我说不准。
    反正大部分情况下,对我来说 cmd.exe 够用了。
    再说吧,有需要另开一贴好了。
    JCZ2MkKb5S8ZX9pq
        26
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-12-18 18:54:19 +08:00
    @no1xsyzy
    ... pythonw.exe" -m idlelib "%L" %*
    都在,还多饶了点参数。
    我是用资源管理器打开方式直接设置的,不知道那个设置的是不是这个结果,不知道注册表哪里看。
    反正目前我暂时没有得到传入参数。

    如果可行,的确你说的这个方法是最便捷的。
    alias 的代价就是额外还是有一个 bat,不过路径指定、自动映射 py 文件名为命令,这个可能都可以用代码解决,我稍后再看看。
    不过 alias 也挺方便了,而且各有一些优劣。
    比如在资源管理器之类的地方,打开文件,有可能误触运行 py。
    另外我如果在 utility 里再分子目录,那调用时如果-m 奏效的情况下也要输入路径,比如我现在有一个 image_tools/remove_exif,用 alias 我就直接定义成 noexif,怎么方便怎么来了。
    JCZ2MkKb5S8ZX9pq
        27
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-12-18 18:57:35 +08:00
    @no1xsyzy
    补充一下,
    用 tool ag1 ag2 直接调用,得到的传入参数是绝对路径,[D:\....\tool.py]
    用 python tool.py ag1 ag2,得到的传入参数是 3 个,[tool.py, ag1, ag2]
    no1xsyzy
        28
    no1xsyzy  
       2019-12-19 09:22:00 +08:00
    @JCZ2MkKb5S8ZX9pq 你的 argv 是被 idlelib 给处理过了
    参考 idlelib.pyshell.main 这个函数
    aloxaf
        29
    aloxaf  
       2019-12-19 12:14:16 +08:00   ❤️ 1
    1. 在环境变量 PATHEXT 中增加 .PY 后缀, 让 cmd 将 .py 识别为可执行文件
    2. 执行 assoc .py=PyFile, 为 .py 文件关联文件类型 ( 可以先执行 assoc .py 查看已是否存在文件关联, 存在的话就不用建立了, 直接使用
    3. 执行 ftype PyFile="C:\Windows\py.exe" "%1" %* 为 PyFile 文件类型关联打开命令 ( Python 路径自行修改
    4. 现在将 .py 文件放到 PATH 中, 应该就可以直接调用了, 甚至不需要后缀.
    JCZ2MkKb5S8ZX9pq
        30
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-12-19 14:52:46 +08:00
    @no1xsyzy 好,我去学习下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5575 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 02:53 · PVG 10:53 · LAX 19:53 · JFK 22:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.