ctypes.windll.shell32.ShellExecute例

いつものように自分だけのためのメモである。

とにかく毎日が CUI と GUI との間の頻繫な行き来なので、特に bash と emacs からの「なにかしらの起動」が結構鬱陶しい。普段は「cmd.exe」の「start」でどうにかごまかしていたが、日本語を含んだりすると途端に破綻したり、引用符の関係がぶっ壊れてたりで、まぁ「ないよりはマシ」でしかなかった。うーん、「start」って ShellExecute してくれてるだけだよなぁ、と、いまさら:

2020-10-24追記: 最初に挙げた版からちょっとだけ変えた。(拡張子補ってる部分。)
 1 #! py -3
 2 # -*- coding: utf-8 -*-
 3 import ctypes
 4 import sys
 5 import os
 6 
 7 
 8 if __name__ == '__main__':
 9     import argparse
10     parser = argparse.ArgumentParser()
11     parser.add_argument("command")
12     parser.add_argument("--cmdargs")
13     parser.add_argument(
14         "--verb",
15         choices=["edit", "find", "open", "print", "properties", "runas"],
16         default="open")
17     nShowCmd = (
18         ("SW_HIDE", 0),
19         ("SW_SHOWNORMAL", 1),
20         ("SW_SHOWMINIMIZED", 2),
21         ("SW_SHOWMAXIMIZED", 3),
22         ("SW_MAXIMIZE", 3),
23         ("SW_SHOWNOACTIVATE", 4),
24         ("SW_SHOW", 5),
25         ("SW_MINIMIZE", 6),
26         ("SW_SHOWMINNOACTIVE", 7),
27         ("SW_SHOWNA", 8),
28         ("SW_RESTORE", 9),
29         ("SW_SHOWDEFAULT", 10),
30     )
31     parser.add_argument(
32         "--showcmd",
33         choices=[m for m, v in nShowCmd],
34         default="SW_SHOWNORMAL")
35     args = parser.parse_args(sys.argv[1:])
36     cmd = os.path.normpath(args.command)
37     pth = os.environ["PATH"].split(";")
38     while not os.path.exists(cmd) and pth:
39         p = pth.pop(0)
40         cmd = os.path.normpath(os.path.join(p, args.command))
41         for ext in ("", ".exe",):
42             if os.path.exists(cmd + ext):
43                 cmd += ext
44                 break
45     if not os.path.exists(cmd):
46         raise OSError("{} was not found.".format(args.command))
47     ctypes.windll.shell32.ShellExecuteW(
48         0,
49         args.verb,
50         cmd,
51         args.cmdargs,
52         "",
53         dict(nShowCmd)[args.showcmd])

Windows 専用なので shebang が「py」なのは問題なかろ。あと PATH の展開はいわゆる「余計なお世話」かもしらん。真似したい場合、必要ないならそこは消して使っておくれ。それと verb は全然期待した動きしてないんだが…、こんなんだったっけ? win9x 時代に使ってた記憶だと、機能してたハズなんだが…。まぁいいや、ワタシは気にしない。