Windowsでの「Path環境変数」を Python から編集

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)

これでめでたく出来上がり。そして動画のようになりますの。

ただねぇ、ちぃと面倒よな。もちっとスマートなものはないかいの?