Ошибка имени при запуске сценария Python через Bash
Я пытаюсь запустить некоторые файлы python (Django) через Bash (для некоторых cronjobs); однако я сталкиваюсь с некоторыми странными ошибками. Установка представляет собой скрипт .sh, который я запускаю с помощью bash, который загружает некоторые исходные файлы & затем запускает файл python через Django Shell. Для демонстрации я закомментировал некоторые части сценария bash, который я использовал во время тестирования.
Bash Script
#!/bin/bash
source /home/grlaer/Desktop/mensam_games/bin/activate
source /home/grlaer/Desktop/mensam_games/vars.env
cd /home/grlaer/Desktop/mensam_games/cards_refactor
#python3 manage.py shell < tcg_sku/test_bash.py
./manage.py shell < tcg_sku/test_bash.py
#cat tcg_sku/test_bash.py | ./manage.py shell
exit 0
Python Script
from datetime import datetime
print(datetime.now())
def do_this():
print("Its printing datetime")
print(datetime.now())
return None
do_this()
Ошибка/Откат
2022-01-16 00:11:02.698550
Its printing datetime
Traceback (most recent call last):
File "./manage.py", line 22, in <module>
main()
File "./manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/home/grlaer/Desktop/mensam_games/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
utility.execute()
File "/home/grlaer/Desktop/mensam_games/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/grlaer/Desktop/mensam_games/lib/python3.8/site-packages/django/core/management/base.py", line 330, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/grlaer/Desktop/mensam_games/lib/python3.8/site-packages/django/core/management/base.py", line 371, in execute
output = self.handle(*args, **options)
File "/home/grlaer/Desktop/mensam_games/lib/python3.8/site-packages/django/core/management/commands/shell.py", line 93, in handle
exec(sys.stdin.read())
File "<string>", line 12, in <module>
File "<string>", line 9, in do_this
NameError: name 'datetime' is not defined
Я запускаю bash test_bash.sh из командной строки и получаю вышеуказанную ошибку; Однако если я сделаю datetime глобальной переменной ИЛИ если я сделаю datetime параметром функции, то все будет работать как надо. Аналогично, если я подстрою сценарий bash так, чтобы вместо попытки запустить файл python из оболочки django, он запускался просто с python, то все работает как надо.
У меня также была такая проблема, что ember python django shell в bash script shell.
Решение действительно, как указано в вопросе, состоит в том, чтобы сделать
globals().update(locals())