[python] 파이썬에서 현재 실행중인 파일의 경로를 얻으려면 어떻게해야합니까?

이것은 초보자 질문처럼 보이지만 그렇지 않습니다. 일부 공통 접근 방식은 모든 경우에 작동하지 않습니다.

sys.argv [0]

이것은을 사용하는 것을 의미 path = os.path.abspath(os.path.dirname(sys.argv[0]))하지만 다른 디렉토리의 다른 Python 스크립트에서 실행하는 경우 작동하지 않으며 실제로 발생할 수 있습니다.

__파일__

이것은을 사용하는 것을 의미 path = os.path.abspath(os.path.dirname(__file__))하지만 이것이 작동하지 않는다는 것을 알았습니다.

  • py2exe이없는 __file__속성을하지만,이 해결 방법은
  • 속성 execute()이없는 IDLE에서 실행할 때__file__
  • 내가 얻는 OS X 10.6 NameError: global name '__file__' is not defined

불완전한 답변이 포함 된 관련 질문 :

위의 모든 유스 케이스에서 작동 하는 일반적인 솔루션을 찾고 있습니다.

최신 정보

테스트 케이스의 결과는 다음과 같습니다.

파이썬 a.py의 출력 (Windows)

a.py: __file__= a.py
a.py: os.getcwd()= C:\zzz

b.py: sys.argv[0]= a.py
b.py: __file__= a.py
b.py: os.getcwd()= C:\zzz

a.py

#! /usr/bin/env python
import os, sys

print "a.py: sys.argv[0]=", sys.argv[0]
print "a.py: __file__=", __file__
print "a.py: os.getcwd()=", os.getcwd()
print

execfile("subdir/b.py")

하위 디렉토리 /b.py

#! /usr/bin/env python
import os, sys

print "b.py: sys.argv[0]=", sys.argv[0]
print "b.py: __file__=", __file__
print "b.py: os.getcwd()=", os.getcwd()
print

나무

C:.
|   a.py
\---subdir
        b.py



답변

실행중인 기본 스크립트의 위치를 ​​직접 결정할 수 없습니다. 결국, 때로는 스크립트가 파일에서 전혀 나오지 않았습니다. 예를 들어, 대화식 인터프리터 또는 메모리에만 저장된 동적으로 생성 된 코드에서 가져올 수 있습니다.

그러나 모듈은 항상 파일에서로드되므로 모듈의 위치를 ​​안정적으로 결정할 수 있습니다. 다음 코드를 사용하여 모듈을 작성하고 기본 스크립트와 동일한 디렉토리에 넣으면 기본 스크립트가 모듈을 가져 와서 해당 모듈을 찾을 수 있습니다.

some_path / module_locator.py :

def we_are_frozen():
    # All of the modules are built-in to the interpreter, e.g., by py2exe
    return hasattr(sys, "frozen")

def module_path():
    encoding = sys.getfilesystemencoding()
    if we_are_frozen():
        return os.path.dirname(unicode(sys.executable, encoding))
    return os.path.dirname(unicode(__file__, encoding))

some_path / main.py :

import module_locator
my_path = module_locator.module_path()

다른 디렉토리에 여러 개의 기본 스크립트가있는 경우 둘 이상의 module_locator 사본이 필요할 수 있습니다.

물론 메인 스크립트가 스크립트와 같은 위치에있는 모듈을 가져올 수없는 다른 도구로로드 된 경우 운이 좋지 않습니다. 그런 경우에, 당신이 추구하는 정보는 단순히 프로그램의 어느 곳에도 존재하지 않습니다. 가장 좋은 방법은 도구 작성자에게 버그를 신고하는 것입니다.


답변

먼저 inspect및 에서 가져와야합니다.os

from inspect import getsourcefile
from os.path import abspath

다음으로, 당신이 사용하는 소스 파일을 찾으려면 어디든지

abspath(getsourcefile(lambda:0))


답변

이 솔루션은 실행 파일에서도 강력합니다.

import inspect, os.path

filename = inspect.getframeinfo(inspect.currentframe()).filename
path     = os.path.dirname(os.path.abspath(filename))


답변

비슷한 문제가 발생하여 문제를 해결할 수 있다고 생각합니다.

def module_path(local_function):
   ''' returns the module path without the use of __file__.  Requires a function defined
   locally in the module.
   from http://stackoverflow.com/questions/729583/getting-file-path-of-imported-module'''
   return os.path.abspath(inspect.getsourcefile(local_function))

일반 스크립트 및 유휴 상태에서 작동합니다. 내가 말할 수있는 것은 다른 사람들을 위해 시험해 보는 것입니다!

내 일반적인 사용법 :

from toolbox import module_path
def main():
   pass # Do stuff

global __modpath__
__modpath__ = module_path(main)

이제 __file__ 대신 __modpath__를 사용합니다.


답변

짧은 대답은 원하는 정보를 얻을 수있는 보장 된 방법이 없지만 거의 항상 실제로 작동하는 휴리스틱이 있다는 것입니다. 당신이 볼 수 어떻게 C에서 실행 파일의 위치를 찾을 수 있습니까? . C 관점에서 문제에 대해 설명하지만 제안 된 솔루션은 Python으로 쉽게 기록됩니다.


답변

내 답변 에서 신뢰할 수없는 변수를 사용하지 않는 이유를 비롯하여 관련 정보 는 상위 폴더에서 모듈 가져 오기 질문에 대한 답변을 참조하십시오 __file__. 이 간단한 솔루션은 모듈 os과 같은 다른 운영 체제와 호환되며 inspectPython의 일부로 제공됩니다.

먼저 inspectos 모듈의 일부를 가져와야 합니다.

from inspect import getsourcefile
from os.path import abspath

다음으로 파이썬 코드에서 필요한 다른 곳에서 다음 줄을 사용하십시오.

abspath(getsourcefile(lambda:0))

작동 방식 :

내장 모듈 os(아래 설명)에서 abspath도구를 가져 옵니다 .

사용중인 시스템에 따라 Mac, NT 또는 Posix 용 OS 루틴.

그런 다음 getsourcefile내장 모듈에서 (아래 설명)을 가져옵니다 inspect.

라이브 Python 객체에서 유용한 정보를 얻습니다.

  • abspath(path) 파일 경로의 절대 / 풀 버전을 반환합니다
  • getsourcefile(lambda:0)어떻게 든 람다 함수 객체의 내부 소스 파일을 얻으므로 '<pyshell#nn>'Python 셸에서 반환하거나 현재 실행중인 Python 코드의 파일 경로를 반환합니다.

abspath결과를 사용하여 getsourcefile(lambda:0)생성 된 파일 경로가 Python 파일의 전체 파일 경로인지 확인해야합니다.
이 설명 솔루션은 원래 Python에서 현재 실행중인 파일의 경로를 얻는 방법에 대한 답변의 코드를 기반으로 설명되었습니다 . .


답변

당신은 단순히 전화했다 :

path = os.path.abspath(os.path.dirname(sys.argv[0]))

대신에:

path = os.path.dirname(os.path.abspath(sys.argv[0]))

abspath()sys.argv[0](코드가있는 파일 이름) 의 절대 경로를 제공 하고 파일 이름 dirname()없이 디렉토리 경로를 반환합니다.