Как изменить рабочий каталог для скрипта оболочки

Как изменить рабочий каталог для скрипта оболочки

У меня есть скрипт Python, который ищет файлы в относительном каталоге. Например: скрипт Python находится в /home/username/projectname/. У меня есть файл, который вызывается внутри скрипта Python, который находится в /home/username/projectname/subfolder.

Если я запускаю скрипт из оболочки, то python scriptname.pyон работает отлично.

Однако я пытаюсь запустить скрипт как службу запуска. Я настраиваю его в webmin, и я полагаю, что он создает скрипт оболочки для его вызова. Через скрипт запуска я делаю что-то вроде этого, чтобы вызвать скрипт:

execute python home/username/projectname/scriptname.py

Скрипт запускается нормально, но не может получить доступ к файлам в соответствующем каталоге.

Я предполагаю, что есть лучший способ вызвать программу Python из скрипта запуска, чтобы она знала относительный путь.

решение1

Быстро и грязно:

В вашем стартовом скрипте вместо простого выполнения скрипта Python используйте cdfirst.

#!/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")
    

    Однако я подозреваю, что у вас это может быть в нескольких каталогах «имя_проекта», поэтому более общее решение будет таким:

    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

Связанный контент