2017-11-10 5 views
0

예를 들어 pymodule이라는 파이썬 모듈이 있다고 가정하면 pymodule.py이라는 파일에 있습니다.python3 : 현재 모듈을 가져 오는 파일의 이름?

또한

, 가정 pymodule는, 예를 들어, 다른 파이썬 프로그램의 숫자에 의해 program0.py, program1.pyprogram2.py을 가져옵니다.

pymodule.py 내에 코드를 입력하여 런타임에 가져올 파일의 이름을 결정할 수 있습니까? 이 예제에서는 실행중인 프로그램에 따라 /path/to/program0.py, /path/to/program1.py 또는 /path/to/program2.py으로 끝납니다.

물론 pymodule이 임포트 된 중첩 된 그룹이있을 수 있으므로 일반적으로 런타임시 가져 오기 상위 파일 이름의 전체 그룹을 얻는 것이 이상적입니다.

python3에서 이것을 수행 할 수있는 방법이 있습니까?

대단히 감사합니다.

답변

0

확인. 나는 그것을 알아. 이 코드는

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