C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

自身のフォルダパス

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によるパスのセパレーターを吸収してくれるので)