結論はこれ
import os
os.popen('powershell -Command ([Environment])::GetFolderPath("""MyVideos""")').read().rstrip('\n')
"MyVideos"の部分を変更で別の場所も取得できます
詳しくは以下のURLで
経緯やはまった部分(何かの参考になれば)
PythonでGUIソフトを作っている際にファイルを保存する処理で、PicturesやVideosに保存したかったのですが、
"Python 特殊ディレクトリ"と調べても、パスを結合させて"C:" + "Users/user" + "Videos"という説明の記事しかなくて、しかもこの場合システムフォルダをDドライブなどの別のドライブやディレクトリに移動させていると対応できませんでした。
Pythonに限らず調べてみると、.NETのEnvironmentクラスのGetFolderPathを使えば取得できることがわかりました。
Pythonで.NETを使う"pythonnet"があるらしいですがなんかよくわからなかったので今回はosモジュールを使用してpowershellで出力した文字を標準出力で取得するやり方にしました。
powershell上では
[Environment]::GetFolderPath("MyVideos")
だけで取得できるのですが、subprocessではpowershellを実行できないので、osモジュールで使用するためにCommandオプションを使用して
powershell -Command [Environment]::GetFolderPath("MyVideos")
、、、では実行できませんでした。
Commandオプションを使う場合で括弧がある場合は、[Environment]
が返されたオブジェクトのメソッドにアクセスするために([Environment])
にする必要があるらしいです。(優先順位かな?)
powershell -Command [Environment]::GetFolderPath
powershell -Command ([Environment])::GetFolderPath("MyVideos")
これをosのpopenで実行しようとしてもまたエラーです。
import os
os.popen('powershell -Command ([Environment])::GetFolderPath("MyVideos")')
理由はpopen内のクォーテーションを認識させるには三つ必要なことです。なので
import os
os.popen('powershell -Command ([Environment])::GetFolderPath("""MyVideos""")')
でようやく実行できます。ただ、これだとまだ文字列ではないので最後に
import os
os.popen('powershell -Command ([Environment])::GetFolderPath("""MyVideos""")').read().rstrip('\n')
文字列として読み取って、余分な改行を削除してようやく絶対パスが取得できました。