我正在尝试使用Django-extension RunScript从Django shell运行脚本.我以前做过这个,但它拒绝承认我的新脚本:
(env) mint@mint-VirtualBox ~/GP/GP $ python manage.py runscript fill_in_random_variants
No (valid) module for script 'fill_in_random_variants' found
Try running with a higher verbosity level like: -v2 or -v3
Run Code Online (Sandbox Code Playgroud)
运行任何其他脚本时工作正常:
(env) mint@mint-VirtualBox ~/GP/GP $ python manage.py runscript fill_in_variants
Success! At least, there were no errors.
Run Code Online (Sandbox Code Playgroud)
我已经仔细检查过该文件是否存在,包括将其重命名为其他内容.我也尝试使用不存在的脚本名称运行命令:
(env) mint@mint-VirtualBox ~/GP/GP $ python manage.py runscript thisfiledoesntexist
No (valid) module for script 'thisfiledoesntexist' found
Try running with a higher verbosity level like: -v2 or -v3
Run Code Online (Sandbox Code Playgroud)
而且错误是一样的.
为什么RunScript找不到我的文件?
RunScript有令人困惑的错误消息.当它根本找不到脚本并且脚本中存在导入错误时,它会给出相同的错误.
这是一个产生错误的示例脚本:
import nonexistrentpackage
def run():
print("Test")
Run Code Online (Sandbox Code Playgroud)
该示例具有脚本的唯一要求,即run
函数.
将其保存为test_script.py
脚本文件夹(例如project root/your app/scripts/test_script.py
).然后尝试运行它:
(env) mint@mint-VirtualBox ~/GP/GP $ python manage.py runscript test_script
No (valid) module for script 'test_script' found
Try running with a higher verbosity level like: -v2 or -v3
Run Code Online (Sandbox Code Playgroud)
哪个是与找不到文件相同的错误.现在取消注册导入行并再试一次:
(env) mint@mint-VirtualBox ~/GP/GP $ python manage.py runscript test_script
Test
Run Code Online (Sandbox Code Playgroud)
据我所知,区分错误的唯一方法是使用verbose(-v2)命令行选项,然后查看返回的第一个(向上滚动)错误:
(env) mint@mint-VirtualBox ~/GP/GP $ python manage.py runscript test_script -v2
Check for www.scripts.test_script
Cannot import module 'www.scripts.test_script': No module named 'nonexistrentpackage'.
Check for django.contrib.admin.scripts.test_script
Cannot import module 'django.contrib.admin.scripts.test_script': No module named 'django.contrib.admin.scripts'.
Check for django.contrib.auth.scripts.test_script
Cannot import module 'django.contrib.auth.scripts.test_script': No module named 'django.contrib.auth.scripts'.
Check for django.contrib.contenttypes.scripts.test_script
Cannot import module 'django.contrib.contenttypes.scripts.test_script': No module named 'django.contrib.contenttypes.scripts'.
Check for django.contrib.sessions.scripts.test_script
Cannot import module 'django.contrib.sessions.scripts.test_script': No module named 'django.contrib.sessions.scripts'.
Check for django.contrib.messages.scripts.test_script
Cannot import module 'django.contrib.messages.scripts.test_script': No module named 'django.contrib.messages.scripts'.
Check for django.contrib.staticfiles.scripts.test_script
Cannot import module 'django.contrib.staticfiles.scripts.test_script': No module named 'django.contrib.staticfiles.scripts'.
Check for django_extensions.scripts.test_script
Cannot import module 'django_extensions.scripts.test_script': No module named 'django_extensions.scripts'.
Check for scripts.test_script
Cannot import module 'scripts.test_script': No module named 'scripts'.
No (valid) module for script 'test_script' found
Run Code Online (Sandbox Code Playgroud)
在哪里我们可以看到关键线:
No module named 'nonexistrentpackage'.
Run Code Online (Sandbox Code Playgroud)
这些错误的共性似乎是因为扩展使用了脚本import
.如果它首先检查文件的存在是否更明智os.path.isfile
,如果没有找到,则抛出更合理的错误消息.
另一件需要注意的重要事情
不应给出 .py,只需给出文件名( script )
python3 manage.py runscript -v3 scriptname;
Run Code Online (Sandbox Code Playgroud)