Django shell - плохая область видимости для файлов сценариев
Проблема:
Дан следующий скрипт python script.py
import time
class Test:
def __init__(self):
print("time class", time) # In class scope
def testing():
print("time method", time) # In method scope
#Test()
print("time top", time) # In file scope
testing()
Когда я пытаюсь выполнить этот файл в оболочке django
python3 manage.py shell < script.py
Я получаю следующую ошибку:
time top <module 'time' (built-in)>
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/kailen/.local/lib/python3.6/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
utility.execute()
File "/home/kailen/.local/lib/python3.6/site-packages/django/core/management/__init__.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/kailen/.local/lib/python3.6/site-packages/django/core/management/base.py", line 330, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/kailen/.local/lib/python3.6/site-packages/django/core/management/base.py", line 371, in execute
output = self.handle(*args, **options)
File "/home/kailen/.local/lib/python3.6/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 8, in testing
NameError: name 'time' is not defined
Эта же ошибка возникает при использовании любой импортированной функции/класса/модуля внутри области видимости метода/класса. Я пробовал назначать псевдоним, импортировать весь модуль и импортировать только нужную функцию, но ничего не помогает.
Контекст:
Я пытался написать демон для использования selenium и некоторых моделей моего django, Я закончил тем, что закодировал его как класс и хотел использовать библиотеку времени для задержки запросов. время для тестирования и я пришел к этой ошибке, я попробовал несколько обходных путей, все они работают, кроме одного случая, который я показал выше. Я не против использования обходных путей, но я не могу взять в толк, что я здесь что-то упускаю.
Что я пробовал:
Следующие способы использования скрипта работают:
python3 manage.py shell -c "import script"
python3 manage.py shell <<< "import script"
cat script.py | python3 manage.py shell
echo "import script" | python3 manage.py shell
Выход:
time top <module 'time' (built-in)>
time method <module 'time' (built-in)>
time class <module 'time' (built-in)>
Актуальный вопрос:
Если кто-нибудь1 может объяснить почему это происходит или как заставить shell < script.py работать (не хочу выходить из игры)