python : 스크립트 작업 디렉토리를 스크립트 자체 디렉토리로 변경하십시오.
매분마다 crontab에서 파이썬 쉘을 실행합니다.
* * * * * /home/udi/foo/bar.py
/home/udi/foo
같은 몇 가지 필수 하위 디렉토리를 가지고 /home/udi/foo/log
하고 /home/udi/foo/config
있는 /home/udi/foo/bar.py
을 의미합니다.
문제는 crontab
다른 작업 디렉토리에서 스크립트 를 실행하여 열려는 시도가 ./log/bar.log
실패 한다는 것 입니다.
작업 디렉토리를 스크립트 자체 디렉토리로 변경하도록 스크립트에 지시하는 좋은 방법이 있습니까? 스크립트의 위치를 명시 적으로 알려주지 않고 모든 스크립트 위치에서 작동하는 솔루션을 좋아합니다.
편집하다:
os.chdir(os.path.dirname(sys.argv[0]))
가장 컴팩트하고 우아한 솔루션이었습니다. 답변과 설명에 감사드립니다!
상대 경로를 여는 것이 작동하도록 현재 작업 디렉토리가 변경됩니다.
import os
os.chdir("/home/udi/foo")
그러나 스크립트를 작성할 때 어떤 디렉토리가 될지 모르더라도 Python 스크립트가있는 디렉토리로 변경하는 방법을 물었습니다. 이를 위해 다음 os.path
기능을 사용할 수 있습니다 .
import os
abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
os.chdir(dname)
스크립트의 파일 이름을 가져 와서 절대 경로로 변환 한 다음 해당 경로의 디렉토리를 추출한 다음 해당 디렉토리로 변경합니다.
을 사용하여 더 짧은 버전을 얻을 수 있습니다 sys.path[0]
.
os.chdir(sys.path[0])
에서 http://docs.python.org/library/sys.html#sys.path
프로그램 시작시 초기화 된이 목록의 첫 번째 항목은
path[0]
Python 인터프리터를 호출하는 데 사용 된 스크립트가 포함 된 디렉토리입니다.
이러지 마
스크립트와 데이터를 하나의 큰 디렉토리에 으깨서는 안됩니다. 일부 알려진 위치 (에 코드를 삽입 site-packages
하거나 /var/opt/udi
또는 무언가) 데이터에서 분리합니다. 코드에서 올바른 버전 제어를 사용하여 현재 버전과 이전 버전이 서로 분리되어 있는지 확인하여 이전 버전으로 돌아가고 향후 버전을 테스트 할 수 있습니다.
결론 : 코드와 데이터를 혼용하지 마십시오.
데이터는 소중합니다. 코드가왔다 갔다합니다.
작업 디렉토리를 명령 행 인수 값으로 제공하십시오. 환경 변수로 기본값을 제공 할 수 있습니다. 그것을 추론하지 마십시오 (또는 추측)
필수 인수 값으로 만들고이를 수행하십시오.
import sys
import os
working= os.environ.get("WORKING_DIRECTORY","/some/default")
if len(sys.argv) > 1: working = sys.argv[1]
os.chdir( working )
소프트웨어의 위치에 따라 디렉토리를 "가정"하지 마십시오. 장기적으로는 제대로 작동하지 않습니다.
crontab 명령을 다음으로 변경하십시오.
* * * * * (cd /home/udi/foo/ || exit 1; ./bar.py)
는 (...)
크론이 단일 명령으로 실행하는 하위 쉘을 시작합니다. 는 || exit 1
디렉토리를 사용할 수없는 경우에 실패하여 cronjob에 발생합니다.
다른 스크립트는 특정 스크립트에 대해 장기적으로 더 우아 할 수 있지만 실행하려는 프로그램이나 명령을 수정할 수없는 경우에도 여전히 예제가 유용 할 수 있습니다.
'IT' 카테고리의 다른 글
파이썬 : 한번만 여러 번 시도 (0) | 2020.06.11 |
---|---|
컬렉션이나 스트림을 반환해야하나요? (0) | 2020.06.11 |
C # 클래스 및 멤버 (필드, 메서드 등)에 대한 기본 가시성 (0) | 2020.06.11 |
Java String은 몇 개의 문자를 가질 수 있습니까? (0) | 2020.06.11 |
FUN 내에서 lapply 인덱스 이름에 액세스 (0) | 2020.06.11 |