상대 디렉터리에서 파일을 찾는 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 스크립트에서 직접 이 문제를 해결할 수 있는 몇 가지 방법이 있습니다.
스크립트가 항상 "/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