質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2643閲覧

python 呼び出し側のパスを取得するモジュールを書きたい(__file__の扱いなど)

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/03/17 23:39

#やりたいこと
プログラムが自分自身のパスを取得するには__file__を使い、これにos.pathなどを組み合わせると思います。
ただ、毎回それを書くのも煩雑なので、できればモジュール化してしまいたいと思っています。

python

1mod.py 2def hogehoge() 3 処理 4 5```  67```python 8import mod 9mod.hogehoge() 10>自分のパスが出力 11

というイメージです。

#現状
↑のことをしたいと思って、モジュールのほうに、__file__を書きました。
しかしこうしてしまうと、そのモジュール自身のパスが取得されるので、思ったようにいきませんでした。

どういう風に書いたらよいのでしょう。
ご指導お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

引数として渡すしかないんじゃないでしょうか。

Python

1def hogehoge(file) 2 処理

Python

1import mod 2mod.hogehoge(__file__)

なお、バージョンが充分新しければos.pathの代わりにpathlibを使えます。
便利なモジュールなので、使い方を知っておくと良いでしょう。
Qiita - Python3.4以降ならos.pathはさっさと捨ててpathlibを使うべき

投稿2018/03/18 00:18

LouiS0616

総合スコア35676

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

umyu

2018/03/18 01:14

無いというわけではないですが、そちらのほうがシンプルです。1票投入しておきました。
退会済みユーザー

退会済みユーザー

2018/03/18 01:49

ありがとうございます。pathlibもご紹介いただきありがとうございます。試してみます。
guest

0

ベストアンサー

29.9. traceback — スタックトレースの表示または取得

関数hogehogeは文字列を戻り値として返すほうが流用できるので好みですが。

mod.py

Python

1# -*- coding: utf-8 -*- 2import traceback 3import re 4 5 6def hogehoge() -> None: 7 for line in traceback.format_stack(limit=2): 8 m = re.match('\s*File\s"(.*)"', line) 9 assert m is not None 10 print(m.group(1)) 11 return 12 13 14def main(): 15 hogehoge() 16 17 18if __name__ == "__main__": 19 main() 20

exsample.py

Python

1# -*- coding: utf-8 -*- 2import mod 3 4 5def main(): 6 mod.hogehoge() 7 8 9if __name__ == "__main__": 10 main() 11

■参考情報
6.2. re — 正規表現操作


2018/03/18追記

sys.argv[0] が使えるのを忘れていました。。
追記:取得できるのはメインモジュールのモジュール名のみです

LouiS0616さんへコード指摘ありがとうございました。

Python

1# -*- coding: utf-8 -*- 2import traceback 3import re 4import sys 5 6 7def executable_path() -> None: 8 print(sys.argv[0]) 9 10 11def hogehoge() -> None: 12 for line in traceback.format_stack(limit=2): 13 m = re.match('\s*File\s"(.*)"', line) 14 assert m is not None 15 print(m.group(1)) 16 return 17 18 19def main(): 20 #hogehoge() 21 executable_path() 22 23 24if __name__ == "__main__": 25 main()

Python

1# -*- coding: utf-8 -*- 2import mod 3 4 5def main(): 6 #mod.hogehoge() 7 mod.executable_path() 8 9 10if __name__ == "__main__": 11 main()

投稿2018/03/18 01:07

編集2018/03/18 11:40
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/18 01:49

ありがとうございます。やりたかったのはこちらのイメージです。理解に少し時間がかかりそうですが、試してみます。
umyu

2018/03/18 01:53

tracebackの回答はスルーして、2番目のsys.argv[0]の回答だけみてくださいな。
LouiS0616

2018/03/18 10:41 編集

二番目の方法ですが、メインモジュール以外からのmod.executable_pathの呼び出しは考慮しなくて良いのでしょうか。
umyu

2018/03/18 11:34

>LouiS0616さんへ 呼び出しパターンとしてネストした呼び出しがありましたね(汗 一切考慮していませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問