Windowsでの「Path環境変数」を Python から編集
前置き
Windowsでの「Path環境変数」の編集は大変やりにくい。Windows 9x の頃から「いつかは使いやすい UI 提供してくれるだろう」と淡い期待をしていたけれど、ついぞその日は来ていない、と。
で、この手の便利ツールというのは、探せばかなり見つかるんだけれども、そこはあえて「ワタシ Python しか頼りになるものがないんです」に徹してみる。Python 2.7 の例です。
簡単だぜ、と思って始めたんだけれど、そうなんだよな、昔と違って今は UAC と格闘せにゃならんのよね。
動画をご覧くたさい
動画内で「python python_runas.py envpath_updater_setvalue.py」を起動した際、本当は「管理者権限で実行しますか?」の例のダイアログが出ているのだけれど、Jing はそこはキャプチャしてくれないみたいで。
を説明
動画内で使ったスクリプトは3つです。
ひとつめ。現在設定値をお取り寄せ。envpath_updater_getcur.py。こいつは簡単です。非常に。
1 # -*- coding: utf-8 -*-
2 import _winreg
3
4 sk = r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
5 k = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, sk)
6 v, ty = _winreg.QueryValueEx(k, "Path")
7 _winreg.CloseKey(k)
8
9 with open(".envpath.txt", "w") as fo:
10 fo.write(u"\n".join(v.split(";")).encode("utf-8") + u"\n")
二つ目。値設定。envpath_updater_setvalue.py。これもスクリプトそのものは簡単なんだけれど。
1 # -*- coding: utf-8 -*-
2 import _winreg
3
4 value = u";".join(
5 open(".envpath.txt").read().decode("utf-8").strip().split("\n"))
6 sk = r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
7 k = _winreg.OpenKey(
8 _winreg.HKEY_LOCAL_MACHINE, sk, 0, _winreg.KEY_SET_VALUE)
9 _winreg.SetValueEx(k, "Path", 0, _winreg.REG_SZ, value)
10 _winreg.CloseKey(k)
インターネット検索すると「_winreg.KEY_ALL_ACCESSでやるとオケ」てふ情報が結構見つかるのでご注意を。それ、家の鍵をなくしたからブルドーザーで玄関を破壊するようなもの。危険というだけでなく、案外逆に「権限エラー」出ますぞ。アクセス権限は必要最小限、が原則。
この2つのスクリプトは、.envpath.txt という名前のテキストファイルで連携します、と。こんな中身ね:
1 C:\Python27
2 C:\Python27\Scripts
3 C:\MinGW\msys\1.0\bin
4 C:\Python27\Scripts
5 C:\Program Files\ffmpeg-20140916-git-b76d613-win64-static\bin
6 C:\Program Files\ImageMagick-6.8.9-Q16
7 C:\Program Files\Common Files\Microsoft Shared\Windows Live
8 C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live
9 %SystemRoot%\system32
10 %SystemRoot%
11 %SystemRoot%\System32\Wbem
12 %SYSTEMROOT%\System32\WindowsPowerShell\v1.0\
13 C:\Program Files (x86)\Windows Live\Shared
14 C:\Program Files (x86)\GnuWin32\bin
15 C:\Program Files\TortoiseHg\
16 C:\Program Files\WinMerge
17 C:\Program Files (x86)\Graphviz2.38\bin
18 C:\Program Files (x86)\emacs-24.2-20121208\bin
さてな、と。問題はここから。「User Access Control (UAC)」、例の「管理者権限で実行」が必要なのですな。これをどうすりゃいいの、と、しばし苦労。だって runas コマンド、使いにくいんですもの…。runas コマンドを起動するスクリプト、というやり方が紹介されてたのでこんなのを:
1 # -*- coding: utf-8 -*-
2 import sys
3 import win32api
4 win32api.ShellExecute(
5 0,
6 'runas',
7 'python',
8 " ".join(sys.argv[1:]),
9 '',
10 0)
これでめでたく出来上がり。そして動画のようになりますの。
ただねぇ、ちぃと面倒よな。もちっとスマートなものはないかいの?