현재 스크립트 디렉토리를 올바르게 결정하는 방법은 무엇입니까? 좋은 방법은

파이썬에서 현재 스크립트 디렉토리를 결정하는 가장 좋은 방법은 무엇입니까?

파이썬 코드를 호출하는 많은 방법으로 인해 좋은 해결책을 찾기가 어렵다는 것을 알았습니다.

몇 가지 문제가 있습니다 :

  • __file__로 스크립트를 실행하면 정의되지 않습니다 exec.execfile
  • __module__ 모듈에서만 정의

사용 사례:

  • ./myfile.py
  • python myfile.py
  • ./somedir/myfile.py
  • python somedir/myfile.py
  • execfile('myfile.py') (다른 스크립트에서 다른 디렉토리에 있으며 다른 현재 디렉토리를 가질 수 있습니다.

완벽한 솔루션이 없다는 것을 알고 있지만 대부분의 경우를 해결하는 최선의 방법을 찾고 있습니다.

가장 많이 사용되는 방법 os.path.dirname(os.path.abspath(__file__))이지만 다른 스크립트를 사용하여 스크립트를 실행하면 실제로 작동하지 않습니다 exec().

경고

현재 디렉토리를 사용하는 모든 솔루션이 실패합니다. 이는 스크립트가 호출되는 방식에 따라 다를 수 있거나 실행중인 스크립트 내에서 변경 될 수 있습니다.



답변

os.path.dirname(os.path.abspath(__file__))

실제로 당신이 얻을 최고입니다.

exec/ execfile; 로 스크립트를 실행하는 것은 일반적이지 않습니다 . 일반적으로 모듈 인프라를 사용하여 스크립트를로드해야합니다. 이 방법을 사용해야하는 경우 스크립트에서 파일 이름을 읽을 수 있도록 설정 __file__하는 것이 좋습니다 globals.

실행 코드에서 파일 이름을 얻는 다른 방법은 없습니다. CWD가 완전히 다른 위치에있을 수 있습니다.


답변

를 통해 스크립트가 호출되는 경우를 실제로 다루려면 모듈을 execfile(...)사용 inspect하여 파일 이름 (경로 포함)을 추론 할 수 있습니다 . 내가 아는 한, 이것은 귀하가 나열된 모든 경우에 적용됩니다.

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


답변

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

def get_script_dir(follow_symlinks=True):
    if getattr(sys, 'frozen', False): # py2exe, PyInstaller, cx_Freeze
        path = os.path.abspath(sys.executable)
    else:
        path = inspect.getabsfile(get_script_dir)
    if follow_symlinks:
        path = os.path.realpath(path)
    return os.path.dirname(path)

print(get_script_dir())

CPython, Jython, Pypy에서 작동합니다. 스크립트를 사용하여 스크립트를 실행하면 작동합니다 execfile()( sys.argv[0]그리고 __file__기반 솔루션은 여기서 실패합니다). 스크립트가 실행 가능한 zip 파일 (/ eg) 안에 있으면 작동합니다 . 스크립트가 PYTHONPATH=/path/to/library.zip python -mscript_to_runzip 파일에서 “가져온”( ) 경우 작동 합니다. 이 경우 아카이브 경로를 반환합니다. 스크립트가 독립형 실행 파일 ( sys.frozen) 로 컴파일 된 경우 작동합니다 . 심볼릭 링크에서 작동합니다 ( realpath심볼릭 링크 제거). 대화식 인터프리터에서 작동합니다. 이 경우 현재 작업 디렉토리를 반환합니다.


답변

Python 3.4 이상에서는 더 간단한 pathlib모듈을 사용할 수 있습니다 .

from inspect import currentframe, getframeinfo
from pathlib import Path

filename = getframeinfo(currentframe()).filename
parent = Path(filename).resolve().parent


답변

그만큼 os.path...방법은 파이썬 2의 ‘할 일’입니다.

Python 3에서는 다음과 같이 스크립트 디렉토리를 찾을 수 있습니다.

from pathlib import Path
cwd = Path(__file__).parents[0]


답변

사용 os.path.dirname(os.path.abspath(__file__))되는 케이스가 실제로 필요한지 여부를 신중하게 사용 하고 조사하십시오 exec. 스크립트를 모듈로 사용할 수없는 경우 문제가 발생할 수 있습니다.

Zen of Python # 8 을 명심하십시오 . 유용 사례에 대한 좋은 주장이 있다고 생각 exec되면 문제의 배경에 대해 더 자세히 알려주십시오.


답변

할 것이다

import os
cwd = os.getcwd()

당신이 원하는 것을합니까? “현재 스크립트 디렉토리”가 정확히 무엇을 의미하는지 잘 모르겠습니다. 제공 한 사용 사례에 대해 예상되는 결과는 무엇입니까?