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

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

상대 디렉터리에서 파일을 찾는 Python 스크립트가 있습니다. 예를 들어 Python 스크립트는 /home/username/projectname/. .NET 파일에 있는 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

관련 정보