pythonで実行中のファイルのフォルダパスが欲しい時が結構あります。
設定ファイルや一時的なファイルを保管したり等です。
"os.getcwd()"で取得する方法もあるのですが、個人的には
”標準モジュールでpathlibあるんだから、そっち使えよ!”派です。
(使いこなせていません・・・)
pathlibを使用した場合は、こんな感じで目的のフォルダパスの
取得が出来ます。
import pathlib print(pathlib.Path(__file__).parent)
"parent"が直感的で良いですね。
ずっとこれでOKだと思っていました。と言いますか、通常は
これでOKです。
そしてFusion360APIの場合も、これでOKです。
素のpython(Fusion360APIでは無い)での”通常"のサンプルは
こんな感じで作りました。
import pathlib from tkinter import messagebox def main(): thisDir = pathlib.Path(__file__).parent messagebox.showinfo("ThisDir", thisDir) if __name__ == "__main__": main()
これをVSCodeで実行するとこんな感じです。
これ(c:/temp/this_dir_test)は正解です。
実は困ったのがExeファイル化した際です。
こちらでも使用した"auto-py-to-exe"です。
auto-py-to-exe - C#ATIA
あぁ、ちょっとこれでも手間取ったので書き残しておきます。
こちらの"コンソール画面"ですが、自分の場合は"ウィンドウベース"に
すると、Windows Defenderに引っ掛かりファイルが作成されずに
削除されました。
念の為、対策方法を調べこちらを見つけて実行したのですが、
効果がありませんでした。
(auto-py-to-exeの実態はPyinstaller)
【Pyinstaller】Windows Defenderに引っかからないようにする #Python - Qiita
お陰様で、pythonを再インストールしクリーンな環境を手に
入れました・・・。
で、Exe化して実行した結果がこちらです。
おいおいおいおい、全然違うパスじゃないのさ。
何となく先日試した"tempfile"のパスっぽくも感じます。
Pyinstallerは一時的にファイルを作成し、そんな感じの処理で
実行させているんじゃないのかな?
一時的なフォルダ - C#ATIA
で、困った末解決案がこれです。
import pathlib from tkinter import messagebox import os def main(): # thisDir = pathlib.Path(__file__).parent thisDir = pathlib.Path(os.getcwd()) messagebox.showinfo("ThisDir", thisDir) if __name__ == "__main__": main()
結局、os.getcwd()使ってんじゃん
えぇPyinstallerを利用すると、これしかなさそうです・・・。
pathlib使わずに、これでもOKです。
thisDir = os.getcwd()
でもpathlib好きです。(osによるパスのセパレーターを吸収してくれるので)