파이썬:스크립트 작업 디렉터리를 스크립트 자체 디렉터리로 변경합니다.

StackOverflow https://stackoverflow.com/questions/1432924

  •  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 디렉토리를 사용할 수없는 경우 크론 조브가 실패하게됩니다.

다른 솔루션은 특정 스크립트의 경우 장기적으로 더 우아 할 수 있지만, 실행하려는 프로그램이나 명령을 수정할 수없는 경우에도 내 예제는 여전히 유용 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top