파이썬에서 클래스의 파일 경로를 어떻게 얻습니까?


95

Python에서 클래스 C가 주어지면 클래스가 정의 된 파일을 어떻게 확인할 수 있습니까? 클래스 C 또는 C의 인스턴스에서 작동 할 수있는 것이 필요합니다.

내가이 작업을하는 이유는 일반적으로 같은 폴더에 함께 속한 파일을 저장하는 팬이기 때문입니다. Django 템플릿을 사용하여 HTML로 렌더링하는 클래스를 만들고 싶습니다. 기본 구현은 클래스가 정의 된 파일 이름을 기반으로 템플릿의 파일 이름을 추론해야합니다.

"base / artifacts.py"파일에 LocationArtifact 클래스를 넣은 다음 템플릿 이름이 "base / LocationArtifact.html"이되도록 기본 동작을 지정합니다.



2
그들은 당신이 파일을 찾고있는 모듈을 알고 있다고 가정하고, 클래스에서 구현 작업을 할 때 모듈 문자열을 갖게 될 것입니다.
— Staale

답변:


130

다음 과 같이 inspect 모듈을 사용할 수 있습니다 .

import inspect
inspect.getfile(C.__class__)

1
내가 뭘 다르게했는지 잘 모르겠지만 대신 getfile다음을 사용해야했습니다. inspect.getmodule(C.__class__)
— AJP

4
참고 : 사용자가 만든 클래스에서 작동하지 않습니다
— 다니엘 브라운

6
아마도 inspect.getfile(C). 경우 C클래스는, 다음 C.__class__을 참조 object예외를 발생시킬 것이다, TypeError: <module 'builtins' (built-in)> is a built-in class. 나는 인스턴스에 대해서만 c사용하고 싶다고 생각합니다 inspect.getfile(c.__class__).
— cheshirekow

1
이는 적절한 파일 대신 metaclass=abc.ABCMeta반환 되므로 추상 기본 클래스 ( ) 를 확장하는 클래스에는 적용되지 않았습니다 /usr/local/lib/python3.7/abc.py. @JarretHardie (아래)의 솔루션이 더 잘 작동했습니다.
— martian111 19 년

36

시험:

import sys, os
os.path.abspath(sys.modules[LocationArtifact.__module__].__file__)

1
(OP로서 원하는) C의 인스턴스에서 경로를 얻기 위해 대체 LocationArtifact과 obj.__class__obj가 LocationArtifact의 인스턴스이다.
— martian111 19 년

5

이것은 Django에 대한 잘못된 접근 방식이며 실제로 작업을 강제합니다.

일반적인 Django 앱 패턴은 다음과 같습니다.

  • /계획
    • / appname
      • models.py
      • views.py
      • / 템플릿
        • index.html
        • 기타

1
+1 : 장고가 자연스럽게하는 일을하고 삶은 훨씬 더 간단합니다.
— S.Lott

1
동의합니다. Django는 "마법"이 가장 적은 프레임 워크 중 하나이지만 템플릿, 템플릿 태그 및 앱은 패턴의 일부로 약간의 기대치를 가지고 있습니다. 이상한 클래스 추론을해야한다면 아마도 잘못된 방향으로 가고있을 것입니다.
— Soviut
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.