У меня есть скрипт 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
first.
#!/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")
Однако я подозреваю, что у вас это может быть в нескольких каталогах «имя_проекта», поэтому более общее решение будет таким:
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