는 방법에 액세스할 수 있습니는 현재 실행하는 모듈 또는 클래스에 이름을 Python?

StackOverflow https://stackoverflow.com/questions/602846

  •  03-07-2019
  •  | 
  •  

문제

나는 할 수 있는 동적으로 검색하는 현재 실행 중인 모듈이나 클래스 이름을 내에서 수입한 모듈이다.여기에 몇 가지 코드:

foo.py:

def f():
    print __name__

bar.py:

from foo import f

def b(): f()

이것은 분명히로 작동하지 않습니다 __name__ 의 이름은 이 모듈을 포함하는 기능입니다.무엇이 되고 싶 내 액세스 foo 모듈은 이름의 현재 실행하면 모듈을 사용하는 foo.그래서 위의 경우에 그것은 것 bar 그러나면 다른 모든 모듈 가져온 foo I would like foo 를 동적으로 액세스할 수 있는 모듈이 있습니다.

편집:inspect 모듈은 매우 유망한지 정확히 무엇을 찾고 있었습니다.무엇이고 어떤 종류의 글로벌 환경-레벨 변수는 나에 액세스할 수 있는 것을 포함하의 이름이 현재 실행 중인 모듈입니다.하지 않는 것이 나는 꺼려하는 통과 스택을 찾을 수 있는 정보-고 생각하는 파이썬 노출될 수 있습니다 데이터를 이미입니다.

편집: 여기에 어떻게하려 하는데 이것을 사용합니다.나는 두 개의 서로 다른 장고는 응용 프로그램을 모두 필요로 오류 로그를 파일입니다.말할 수 있습니다 그들은"AppOne"및"AppTwo".내가 또한 장소는 로그인하고 싶다면 이런 파:"/home/hare/app_logs".각 응용 프로그램에서 특정 시점에서 나는 것을 가져올 수 있는 내 로거 모듈 및 전화 로그 기능을 쓰는 문자열에는 로그를 파일입니다.그러나고 싶은 마을 만들 디렉토리 app_logs 는 이름의 현재 응용 프로그램("AppOne"또는"AppTwo")도록 각각의 응용 프로그램의 로그 파일에서 각각의 로깅 디렉토리입니다.

이를 위해서는 내가 생각하는 가장 좋은 방법이 될 것이라고 로거 모듈에 액세스하는 일종의 전역 변수로 나타내는 현재 응용 프로그램의 이름으로 책임 있는 위치의 부모 logging directory 응용 프로그램을 만들의 logging directory 면 그것은 아직 존재하지 않습니다.

도움이 되었습니까?

해결책

에서 comment--지 않는 질문입니다.

나는 단순히 궁금하다 보면 내가 무엇을 하려고가 가능합니다.

에 대한 답은"그것을 가능"항상"네".다.지 않는 한 당신의 질문에 포함 시간 여행은,반대로 중력 또는 영구 모션입니다.

이 대답은 항상"네",당신의 질문에 병이 형성된다.진짜 문제는"무엇이 좋은 방법을 로깅 모듈 이름을 알고 있는 클라이언트의?"또는 이와 같습니다.

대답은"그것을 받아들을 매개 변수로 사용할 수 있습니다." 하지 않을 검사하고 신비한 전역 또는 다른 묘.

그냥 따르는 디자인 패턴의 기록합니다.getLogger()를 사용하여 명시적으로 이름의 로거.일반적인 문구가 다음

logger= logging.getLogger( __name__ )

을 처리하는 거의 모든 로그명니다.

다른 팁

이 작업에 대한 참조하여 현재 모듈:

import sys
sys.modules[__name__]

"현재 실행하면 모듈을"명확하게은 foo,로는 무엇이 포함 기능을 현재 실행 중인-내 생각이 더 대한 설명으로 당신이 원하는 것은 모듈의 foo 의 즉각적인 발신자(수 있는 것 자체가 foo 는 경우에 당신을 호출하 f()함수에서 foo 라는 함수에 의해 제공하는 것입니다.얼마나 멀리 가고 싶은지에 달려 당신이 원하는 것 이다.

어떤 경우에는,가정을 원하는 호출자,당신을 얻을 수 있습니다 이 도보로 호출 스택입니다.이 작업을 수행할 수 있습니다 호출하여 sys._getframe, 으로,aprropriate 수준의 걸을 수 있습니다.

def f():
    caller = sys._getframe(1)  # Obtain calling frame
    print "Called from module", caller.f_globals['__name__']

[편집]:실제로 사용하여, 검사 모듈은 위의 제안으로 아마리 취득의 스 프레임입니다.다음과 같은 코드를 사용합니다:

def f():
    caller = inspect.currentframe().f_back
    print "Called from module", caller.f_globals['__name__']

(sys._getframe 문서화로 인해 내부 사용을 검사하는 모듈은 더 많은 신뢰할 수 있는 API)

나는 당신이 원하는 것을 생각하는 사용 검사 모듈을 검사하는 파이썬 런타임 스택입니다.체크 아웃 튜토리얼.나는 생각한 제공 거의 정확한 예 당신이 원하는 무엇을 할 수 있다.

__file__ 은 경로의 현재 모듈 통화가 수행됩니다.

대한 참조를 가져오는"__main__"면 모듈을 다른:

import sys
sys.modules['__main__']

다음 얻기 모듈의 파일 경로를 포함하는,그 이름:

sys.modules['__main__'].__file__

는 경우에"__main__"모듈,단순히 사용: __file__

를 얻는 파일 이름에서 파일 경로:

import os
os.path.basename(file_path)

하여 별도의 파일 이름에서 확장자:

file_name.split(".")[0]

이름을 얻 클래스의 인스턴스:

instance.__class__.__name__

의 이름을 얻 클래스:

class.__name__

나는 그것을 믿지 않는한 그 이후의 foo's scope.foo 만 알고 있어야의 내부 범위는 그것이 될 수 있기 때문에 불에 의해 수많은 다른 모듈 및 응용 프로그램입니다.

__file__ 만으로 상대 경로에 대한 기본 모듈과 절대 경로를 수입한 모듈을 사용합니다.식이 우리가 얻을 수 있는 모듈은 파일을 지속적으로 어떤 방법으로 약간의 도움에서 우리의 os.path 도구입니다.

파일이름으로만 사용 __file__.split(os.path.sep)[-1].

에 대한 완전한 경로를 사용하여 os.path.abspath(__file__).

Demo:

/tmp $ cat f.py
from pprint import pprint
import os
import sys

pprint({
    'sys.modules[__name__]': sys.modules[__name__],
    '__file__': __file__,
    '__file__.split(os.path.sep)[-1]': __file__.split(os.path.sep)[-1],
    'os.path.abspath(__file__)': os.path.abspath(__file__),
})

/tmp $ cat i.py
import f

결과:

## on *Nix ##

/tmp $ python3 f.py
{'sys.modules[__name__]': <module '__main__' from 'f.py'>,
 '__file__': 'f.py',
 '__file__.split(os.path.sep)[-1]': 'f.py',
 'os.path.abspath(__file__)': '/tmp/f.py'}

/tmp $ python3 i.py
{'sys.modules[__name__]': <module 'f' from '/tmp/f.pyc'>,
 '__file__': '/tmp/f.pyc',
 '__file__.split(os.path.sep)[-1]': 'f.pyc',
 'os.path.abspath(__file__)': '/tmp/f.pyc'}

## on Windows ##

PS C:\tmp> python3.exe f.py
{'sys.modules[__name__]': <module '__main__' from 'f.py'>,
 '__file__': 'f.py',
 '__file__.split(os.path.sep)[-1]': 'f.py',
 'os.path.abspath(__file__)': 'C:\\tools\\cygwin\\tmp\\f.py'}

PS C:\tmp> python3.exe i.py
{'sys.modules[__name__]': <module 'f' from 'C:\\tools\\cygwin\\tmp\\f.py'>,
 '__file__': 'C:\\tools\\cygwin\\tmp\\f.py',
 '__file__.split(os.path.sep)[-1]': 'f.py',
 'os.path.abspath(__file__)': 'C:\\tools\\cygwin\\tmp\\f.py'}

하려는 경우 지구의'.py'떨어져 결국,당신이 할 수 있는 쉽습니다.(그러나 잊지 마세요 당신을 실행할 수 있습니다'.pyc'대신 합니다.)

그것은 이후 나는 파이썬은,그러나 믿는 당신은에 액세스 할 수 있습니다 globals 과 지역 주민의 호출을 통해 그것의 추적.

당신이 원하는 경우에만 파일의 이름:

file_name = __file__.split("/")[len(__file__.split("/"))-1]

현재 파일을 모듈을 포함하는 폴더,여기에 무엇이 나를 위해 일했:

 import os
 parts = os.path.splitext(__name__)
 module_name = parts[len(parts) - 2]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top