2017-11-10 3 views
0

たとえば、pymoduleと呼ばれるPythonモジュールがpymodule.pyというファイルにあるとします。python3:現在のモジュールをインポートするファイルの名前ですか?

さらに、program0.py,program1.py、およびprogram2.pyのような他の数多くのPythonプログラムによってpymoduleがインポートされたとします。

pymodule.pyに書き込むことのできるコードはありますか?実行時にインポートするファイルの名前を決定しますか?この例では、これら3つのプログラムのいずれが実行されているかに応じて、/path/to/program0.py,/path/to/program1.py、または/path/to/program2.pyのいずれかになります。

もちろん、pymoduleがインポートされたネストされたインポートグループがある可能性があります。したがって、一般的なケースでは、実行時にこの祖先のファイル名のグループ全体を取得するのが理想的です。

python3でこれを行う方法はありますか?

ありがとうございました。

答えて

0

OK。私はそれを考え出した。このコードは、

filename: <frozen importlib._bootstrap> 
filename: <frozen importlib._bootstrap_external> 
filename: <frozen importlib._bootstrap> 
filename: <frozen importlib._bootstrap> 
filename: <frozen importlib._bootstrap> 
filename: /path/to/program0.py 

だから、私がしなければならないすべては <frozen ...で始まる項目を無視している...それが実行されている場合は、次の /path/to/program0.py出力し

# This is the "parent" of the current module. 
# `sys._getframe(0)` would be `pymodule.py`. 
f = sys._getframe(1) 
while f is not None: 
    print('filename: {}'.format(f.f_code.co_filename) 
    f = f.f_back 

... pymodule.pyに存在することもあります私は祖先のファイル名を取得します。ここにはその機能があります...

def ancestor_importers(): 
    ancestors = [] 
    # Start with item number 2 here, because we're 
    # inside of a function. Assume this function 
    # resides at the top level of `pymodule`. If not, 
    # the argument of sys._getframe(2) needs to be 
    # adjusted accordingly. 
    f = sys._getframe(2) 
    while f is not None: 
     fn = f.f_code.co_filename 
     if not fn.startswith('<frozen '): 
      ancestors.append(fn) 
     f = f.f_back 
    return ancestors 
関連する問題