쉘 스크립트의 작업 디렉토리를 변경하는 방법

쉘 스크립트의 작업 디렉토리를 변경하는 방법

상대 디렉터리에서 파일을 찾는 Python 스크립트가 있습니다. 예: Python 스크립트는 에 있습니다 /home/username/projectname/. 에 있는 Python 스크립트에 호출된 파일이 있습니다 /home/username/projectname/subfolder.

쉘에서 스크립트를 실행하면 python scriptname.py정상적으로 실행됩니다.

그러나 스크립트를 시작 서비스로 실행하려고 합니다. Webmin에서 설정 중이고 이를 호출하기 위한 쉘 스크립트를 생성한다고 생각합니다. 시작 스크립트를 사용하여 스크립트를 호출하기 위해 다음과 같은 작업을 수행합니다.

execute python home/username/projectname/scriptname.py

스크립트는 정상적으로 시작되지만 상대 디렉터리의 파일에 액세스할 수 없습니다.

나는 상대 경로를 알 수 있도록 시작 스크립트에서 Python 프로그램을 호출하는 더 좋은 방법이 있다고 생각합니다.

답변1

빠르고 더러운:

시작 스크립트에서 Python 스크립트를 실행만 하지 말고 cd먼저 사용하세요.

#!/bin/sh

cd /home/username/projectname &&
python ./scriptname.py

답변2

Python 스크립트에서 이 문제를 직접 해결하는 방법에는 여러 가지가 있습니다.

  1. 스크립트가 항상 "/home/username/projectname/subfolder"에 있는 경우 Python 내의 검색 경로에 간단히 추가할 수 있습니다.

    import sys
    sys.path.append("/home/username/projectname/subfolder")
    

    그러나 여러 "projectname" 디렉터리에 넣을 수도 있으므로 보다 일반적인 솔루션은 다음과 같습니다.

    import sys
    import os
    sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), "subfolder"))
    

    그러면 Python 스크립트가 있는 디렉터리( sys.argv[0])를 찾아 디렉터리 부분을 추출하고 여기에 "하위 폴더"를 추가한 다음 검색 경로에 넣습니다.

    일부 운영 체제에서는 실행 파일 이름만 제공할 수 있습니다 sys.argv[0]. 나는 이 상황에 대한 좋은 해결책을 가지고 있지 않습니다. 어쩌면 다른 사람이 그럴 수도 있습니다. 상대 경로가 있는 경우 os.path.abspath()호출을 삽입 해야 할 수도 있지만 sys.argv[0]약간의 실험을 통해 작동하게 할 수 있습니다.

  2. 위의 답변과 유사하게 래퍼 스크립트 없이도 Python 스크립트가 자체적으로 디렉터리를 변경하도록 할 수 있습니다.

    import os
    os.chdir("/home/username/projectname")
    

답변3

더 빠르고 더러운 방법(서브쉘 사용):

( cd my/path/to/folder && python myprogram.py )

답변4

set PYTHONPATH=PROJECTPATH && python script.py

관련 정보