파이썬:스크립트 작업 디렉터리를 스크립트 자체 디렉터리로 변경합니다.
-
07-07-2019 - |
문제
매분마다 crontab에서 Python 쉘을 실행합니다.
* * * * * /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)
그만큼 (...)
Crond가 단일 명령으로 실행하는 하위 쉘을 시작합니다. 그만큼 || exit 1
디렉토리를 사용할 수없는 경우 크론 조브가 실패하게됩니다.
다른 솔루션은 특정 스크립트의 경우 장기적으로 더 우아 할 수 있지만, 실행하려는 프로그램이나 명령을 수정할 수없는 경우에도 내 예제는 여전히 유용 할 수 있습니다.