【发布时间】:2021-02-10 16:38:19
【问题描述】:
我有一个 Django 服务,我们正在尝试将其与定期运行的主应用程序一起安排,以通过批处理脚本发送自动电子邮件。
Django 应用程序本身启动良好,但是当我尝试运行批处理脚本时,我得到以下回溯:
Traceback (most recent call last):
File "C:\Program Files\compuweather\compuweather\webapp\management\commands\send_all_clients.py",
line 2, in <module> from django.core.management.base import BaseCommand
File "C:\ProgramData\Anaconda3\lib\site-packages\django-3.2-
py3.8.egg\django\core\management\__init__.py", line 13, in <module>
from django.apps import apps
File "C:\ProgramData\Anaconda3\lib\site-packages\django-3.2-py3.8.egg\django\apps\__init__.py", line
1, in <module> from .config import AppConfig
File "C:\ProgramData\Anaconda3\lib\site-packages\django-3.2-py3.8.egg\django\apps\config.py", line 7,
in <module> from django.utils.deprecation import RemovedInDjango41Warning
File "C:\ProgramData\Anaconda3\lib\site-packages\django-3.2-py3.8.egg\django\utils\deprecation.py",
line 5, in <module>
from asgiref.sync import sync_to_async
ModuleNotFoundError: No module named asgiref
考虑到我将批处理文件设置为从安装了 Asgiref 的 anaconda 环境运行,我觉得这很奇怪。我可以用 pip freeze 来验证这一点。以下是我正在使用的软件包版本:
asgiref==3.3.1
Django==3.1.6
我看到了类似的问题here,这是由于 Django 和 asgiref 包已过时。我已经尝试将 asgiref 和 Django 都更新到最新版本(列出的那些),但这也没有帮助。
查看回溯后,我最好的猜测是尝试使用已弃用的包(因此使用 deprecation.py)或需要在某处附加路径。如果是前者,我应该使用其他替代方法吗?
作为参考,这是我尝试使用的批处理文件:
call C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3
call activate test
"C:\ProgramData\Anaconda3\Python.exe" "C:\Program Files\compuweather\compuweather\webapp\management\commands\send_all_clients.py"
【问题讨论】:
-
试试
py "C:\Program Files\compuweather\compuweather\webapp\management\commands\send_all_clients.py" -
我认为您的 venv 未正确激活。为什么不使用
manage.py在批处理中运行自定义管理命令?类似python C:\Program Files\compuweather\compuweather\manage.py send_all_clients -
@Benbb96 不,它肯定会正确激活,但直接从 manage.py 运行它是一个好建议。我会试试的
-
cmd /k只是打开一个新的空cmd.exe实例,完成上面的三个命令后,你希望它做什么?您设置和激活的环境肯定是为现有的cmd.exe实例而设计的,而不是为新的实例而设计的。此外,您的代码并未从您的第一个call命令开始就表明您的当前目录是什么。由于我们不知道您的 avtivation 命令使用或创建了什么或哪些变量,因此我们无法知道当前目录或模块的位置,因此无法告诉您应该在哪里找到它们。 -
@Compo 好吧,这不太准确。 cmd /k 返回到现有的终端实例。它保留所有相同的配置,因此对于在发生错误时进行调试很有用。它将加载环境并显示所有错误消息,而不是关闭终端。至于路径,对我来说,这意味着您想知道 conda 环境和可用软件包的路径。我可以补充一点,但实际上没有必要。如果某个地方需要 sys.path.append,我只需要知道在哪里添加它。我知道那里会走什么路
标签: python django batch-file