Ответ 1
После долгих проб и ошибок и многих, многих статей stackoverflow.com и других учебных пособий в Интернете, и с помощью Perl script я обнаружил, что сделал что-то подобное, я смог выяснить, что нужно сделать чтобы это работало.
Вот шаги, необходимые для правильной настройки:
-
Убедитесь, что у вас есть переменные, которые вам нужны в PYTHONPATH (найдено здесь и здесь и для получения дополнительной информации. здесь) внутри .profile или .bash_profile для любой оболочки, которую вы хотите протестировать script, чтобы убедиться, что он работает.
-
Отредактируйте свой crontab, чтобы включить каталоги, необходимые для запуска вашего script в задании cron (найдено здесь и here).
a) Обязательно укажите корневой каталог в переменной PATH (.), как описано здесь. В принципе, если вы выполняете исполняемый файл с помощью своей команды, он должен иметь возможность находить корень или каталог, в котором хранится исполняемый файл, а также, возможно, следующие: (/sbin:/bin:/usr/sbin:/usr/bin).
-
В вашем файле crontab создайте cronjob, который изменит текущий каталог в каталог, в котором вы успешно выполнили script раньше (например,/Users/user/Documents/foo).
a) Это будет выглядеть следующим образом:
* * * * cd /Users/user/Documents/foo; bar -l doSomething -v
-
Поскольку моя проблема касалась конкретно вызова исполняемого файла, необходимо отметить, что существует несколько способов записи запускаемого Python script (хотя в процессе обнаружения я узнал, что это работает для любого вызова сделанный с использованием подпроцесса в cron).
Первый метод выглядит следующим образом:
... #some script calls my_env = os.environ.copy() my_env["PYTHONPATH"] = "{}:{}".format(os.environ["PATH"] ,"<path you want to include>") os.chdir("<path/to/desired/directory>") subprocess.Popen(<call_as_string>, env=my_env, shell=True)
И второе выглядит так:
... #some script calls os.environ["PYTHONPATH"] = "{}:{}".format(os.environ["PATH"] ,"<path you want to include>") os.chdir("<path/to/desired/directory>") subprocess.Popen(<call_as_list_of_arguments)
Поскольку исполняемому файлу нужен путь к каталогу помощников, включенному в оболочку, откуда он был вызван, необходимо передать переменную окружения в исполняемый файл, как описано здесь. Однако я обнаружил, что изменение переменной PATH в среде не работало для задания cron, но установка PYTHONPATH выполнялась. Я читаю здесь, что переменная PATH используется оболочкой только для поиска исполняемых файлов, поэтому для новой оболочки внутри cronjob вам нужно передать оболочке PYTHONPATH, чтобы посмотреть для новых модулей Python. (Это также объясняется в документах Python.)
Различия между двумя различными методами объясняются в документации к подпроцессу, указанной в вопросе, но хороший учебник по этому модулю можно найти здесь.