이것은 초보자 질문처럼 보이지만 그렇지 않습니다. 일부 공통 접근 방식은 모든 경우에 작동하지 않습니다.
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
불완전한 답변이 포함 된 관련 질문 :
- Python-실행중인 파일 경로 찾기
- 현재 파일의 경로는 프로그램 실행 방법에 따라 다릅니다.
- 파이썬에서 실행중인 스크립트의 경로를 아는 방법?
- 디렉토리를 Python 스크립트의 디렉토리로 변경
위의 모든 유스 케이스에서 작동 하는 일반적인 솔루션을 찾고 있습니다.
최신 정보
테스트 케이스의 결과는 다음과 같습니다.
파이썬 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
과 같은 다른 운영 체제와 호환되며 inspect
Python의 일부로 제공됩니다.
먼저 inspect 및 os 모듈의 일부를 가져와야 합니다.
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()
없이 디렉토리 경로를 반환합니다.