태그 보관물: python

python

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에 발생합니다.

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


답변