카테고리 보관물: Python

Python

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

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

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

몇 가지 문제가 있습니다 :

  • __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()

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