![쉘 스크립트의 작업 디렉토리를 변경하는 방법](https://linux55.com/image/23772/%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98%20%EC%9E%91%EC%97%85%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EB%A5%BC%20%EB%B3%80%EA%B2%BD%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
상대 디렉터리에서 파일을 찾는 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 스크립트에서 이 문제를 직접 해결하는 방법에는 여러 가지가 있습니다.
스크립트가 항상 "/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]
약간의 실험을 통해 작동하게 할 수 있습니다.위의 답변과 유사하게 래퍼 스크립트 없이도 Python 스크립트가 자체적으로 디렉터리를 변경하도록 할 수 있습니다.
import os os.chdir("/home/username/projectname")
답변3
더 빠르고 더러운 방법(서브쉘 사용):
( cd my/path/to/folder && python myprogram.py )
답변4
set PYTHONPATH=PROJECTPATH && python script.py