質問: Visual Studio Code (vscode) や Atom のテキストエディターでpythonのプログラムを書いています。 どちらのテキストエディターでも同じことが起こっているので vscode について書いていきます。 vscodeの中で別のファイルのパスが必要なプログラムを実行しようとする時、パスを**相対パス**に指定すると動かず、ルートフォルダ(ツリーの一番上のフォルダ)からのパス(**ルートパス**と呼ぶことにします)に指定すると動きます。 普通にエクスプローラーで表示し、ダブルクリックして実行する際には逆に、相対パスで指定すると動き、当たり前ですが、先程のルートパスを指定すると動きません。 **例)** vscodeのルートフォルダーは「RootFolder」 ``` RootFolder---01---test.py ---02---text.txt ``` という時、「test.py」のプログラム内で「text.txt」のパスを指定する時、 **vscode内で実行する際には、「02/text.txt」としたときのみ動き**、 **普通に実行する際には、「../02/text.txt」としたときのみ動き**ます。 vscode内でルートフォルダを「01」に指定すれば、ルートパスも相対パスも同じになるので動きますが、同一フォルダ内のプログラムしか扱えないのは不便です。 かといって、毎回pythonのファイルを開いて動作を確認するのは面倒です。 ちなみに絶対パスを指定するとどちらでも動きます。しかしこれも不便なので... そこで、**vscode内から相対パスを使ってプログラムを実行する方法**はないでしょうか?
回答: コメントに紹介した記事で解決とのことですが、実はタイトルと質問の最後は「vscode内から相対パスを使ってプログラムを実行する方法」になっていますが、途中の説明は「text.txt」のパス指定に関することなので、「実行」とは関係が無いように見えます。しかも「vscode内から相対パスを使ってプログラムを実行する」という言葉の意味するところが何を指しているのか他の人には判り難い状況です。 そこで、**「VSCodeにおいて、Pythonスクリプト実行時のカレントフォルダを対象スクリプトの存在するフォルダに設定する方法」** と置き換えると以下の記事が参考になるでしょう。 VS Code で Python をデバッグする Visual Studio Codeで実行時のカレントディレクトリをファイルのあるディレクトリにする いずれも`launch.json`ファイルの`"configurations" : { }`に`"cwd": "${fileDirname}"`を追加するという対処です。 しかし上記だと、「スクリプトのあるフォルダがカレントフォルダであること」という条件が付いて回ることになり、汎用性という意味ではあまり良くありません。 実際にこの質問の次に「text.txt」ではなくモジュールのimportでつまづいていることでも明らかです。 スクリプトがどこのフォルダにあっても、また例えばVSCodeから実行するのでもPythonで直接実行するのでも動作するようにするためには、スクリプトファイル自身のパスをプログラム内で取得して、それを基に使用ファイルの相対パスを作ったり、モジュールのサーチパスを追加したりするのが良いでしょう。 プログラム自身でカレントフォルダを移動しても良い訳ですし。 Pythonで実行中のファイルの場所(パス)を取得する__file__ 【python】実行スクリプトからの相対パスでファイルを開く `__file__`という特別なグローバル変数に、スクリプト自身のパスが入っているので、それを基に処理を行いましょうということです。 runpy --- Python モジュールの位置特定と実行 ただし、Pythonの__file__は、対話モードで実行するとエラーになるのでご注意を。 関連して他にもこんなのが。 __file__を使用しても実行中のスクリプトのディレクトリ名を取得できない理由を調べる