LoginSignup
0
0

More than 1 year has passed since last update.

Pythonで特殊ディレクトリの絶対パスを取得する

Posted at

結論はこれ

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オプションを使用して

NG
powershell -Command [Environment]::GetFolderPath("MyVideos")

、、、では実行できませんでした。
Commandオプションを使う場合で括弧がある場合は、[Environment]が返されたオブジェクトのメソッドにアクセスするために([Environment])にする必要があるらしいです。(優先順位かな?)

括弧がないのでOK
powershell -Command [Environment]::GetFolderPath
OK
powershell -Command ([Environment])::GetFolderPath("MyVideos")

これをosのpopenで実行しようとしてもまたエラーです。

NG
import os
os.popen('powershell -Command ([Environment])::GetFolderPath("MyVideos")')

理由はpopen内のクォーテーションを認識させるには三つ必要なことです。なので

OK
import os
os.popen('powershell -Command ([Environment])::GetFolderPath("""MyVideos""")')

でようやく実行できます。ただ、これだとまだ文字列ではないので最後に

OK
import os
os.popen('powershell -Command ([Environment])::GetFolderPath("""MyVideos""")').read().rstrip('\n')

文字列として読み取って、余分な改行を削除してようやく絶対パスが取得できました。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0