Есть ли более элегантный способ ссылки на текущий каталог скрипта? - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть среда разработки и производство для запуска различных Python сценариев, используемых в crontab.

В среде разработчиков я обычно тестирую сценарии из командной строки в каталоге сценариев, например "python myscript.py".Теперь некоторые скрипты загружают конфигурацию из JSON файлов в том же или подкаталоге каталога скриптов.Поэтому в dev я могу ссылаться на файл так:

printconf = Config('printing.json')

Однако, как только сценарий готов к работе, он помещается в crontab, а crontab вызывает сценарии из root, следовательно, ломая вышеуказанную строку.

Кроме того, dev и production явно находятся в разных местах файловой системы, поэтому я даже не могу использовать абсолютные пути, потому что они не будут одинаковыми.

Как описано в Как найти каталог скрипта с помощью Python? , я могу использовать различные методы для поиска файла текущего каталога.Однако они означают дополнительную обработку, и мне было интересно, может ли какая-либо версия Python иметь (или могла бы запланировать) какой-либо дополнительный встроенный способ сообщить, что файл должен быть найден относительно каталога запущенного скрипта?Что-то вроде __location__?

По сути, то, что будет работать для ссылок на файлы, таких как импорт модулей, уже делает.

Кроме того, я попытался добавить глобальную переменную __location__ через sitecustomize.py, но это даже не работает.

sitecustomize.py:

if '__file__' in globals():
    import os
    _location_ = os.path.join(os.getcwd(), os.path.dirname(__file__))

Но это тоже не работает, потому что: - __location__не передается в сценарий, - и __file__ относится к sitecustomize.py

1 Ответ

0 голосов
/ 14 февраля 2019

Прежде всего, ваша среда разработки и разработки не должна сильно отличаться.Это означает, что для согласованности вы должны использовать одну и ту же настройку (файловую систему, библиотеки и т. Д.) Для обоих.Таким образом, большинство ваших проблем исчезнет.Если вы сделаете это, тогда будет безопасно использовать жестко заданный путь.

Другие варианты (которые неизбежно связаны с некоторой обработкой, но не должны нарушать условия сделки):

  1. Использование os.getcwd() и __file__, как вы уже предлагали.
  2. Используйте определенный аргумент при запуске ваших скриптов (например: $SCRIPT_PATH/myscript.py PROD) и выбирайте ваши пути на основе этого внутри скрипта.
  3. Использованиевыделенный файл конфигурации только для скрипта init, поместите его в одно и то же место как на DEV, так и на PROD (я бы предложил в /etc/$PROJECT_NAME) и запустите скрипт с определенным аргументом (как упомянуто выше).

Ни один из вышеперечисленных методов не предотвратит другие проблемы, связанные с согласованностью, что заставляет меня подчеркнуть, что вам следует рассмотреть возможность использования Docker или Vagrant для вашей настройки Dev (и / или Prod, если это возможно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...