1

在使用 C 和 C++ 编写多年之后,我觉得在涉及 python 和 django 时有点笨。我似乎无法得到一些简单的工作。我承认该错误已在许多帖子中讨论过。

我开始浏览一些 django 教程,所以我运行了“django-admin startproject mysite”,它创建了一个“mysite”文件夹。

我已经安装了 django_extensions,所以现在我正在尝试使用它的“运行脚本”。我有一个更复杂的脚本,我想稍后运行,但现在,我正在尝试调用一个简单的用户脚本,我通过这种机制在网上找到它,即

mysimplescript.py:

def run(*script_args):
print script_args

它位于“脚本”文件夹中,因此我的结构如下,其中外部 mysite/ 根目录只是我项目的容器:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    scripts
        __init__.py
        mysimplescript.py

当我按如下方式运行脚本时,出现相对导入错误。

python manage.py runscript .scripts.mysimplescript.py --script-args  
Testing 123

/usr/lib/python2.7/site-packages/Django-1.9.2-py2.7.egg/django/core 
/management/base.py:265:  RemovedInDjango110Warning: 
OptionParser usage for Django management commands is deprecated, use 
ArgumentParser instead

RemovedInDjango110Warning)
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/usr/lib/python2.7/site-packages/Django-1.9.2-py2.7.egg/django/core  
/management/__init__.py", line 353, in execute_from_command_line
utility.execute()
File "/usr/lib/python2.7/site-packages/Django-1.9.2-py2.7.egg/django/core 
/management/__init__.py", line 345, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/lib/python2.7/site-packages/django_extensions-1.6.1-py2.7.egg/ 
django_extensions/management/email_notifications.py", line 63, in   
run_from_argv
super(EmailNotificationCommand, self).run_from_argv(argv)
File "/usr/lib/python2.7/site-packages/Django-1.9.2-py2.7.egg/django/core 
/management/base.py", line 348, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/lib/python2.7/site-packages/django_extensions-1.6.1-py2.7.egg/ 
django_extensions/management/email_notifications.py", line 75, in execute
super(EmailNotificationCommand, self).execute(*args, **options)
File "/usr/lib/python2.7/site-packages/Django-1.9.2-py2.7.egg/django/core 
/management/base.py", line 399, in execute
output = self.handle(*args, **options)
File "/usr/lib/python2.7/site-packages/django_extensions-1.6.1-py2.7.egg/ 
django_extensions/management/utils.py", line 57, in inner
ret = func(self, *args, **kwargs)
File "/usr/lib/python2.7/site-packages/django_extensions-1.6.1-py2.7.egg/ 
django_extensions/management/commands/runscript.py", line 163, in handle
modules = find_modules_for_script(script)
File "/usr/lib/python2.7/site-packages/django_extensions-1.6.1-py2.7.egg/ 
django_extensions/management/commands/runscript.py", line 146, in  
find_modules_for_script
mod = my_import(nn)
File "/usr/lib/python2.7/site-packages/django_extensions-1.6.1-py2.7.egg/ 
django_extensions/management/commands/runscript.py", line 99, in my_import
importlib.import_module(mod)
File "/usr/lib64/python2.7/importlib/__init__.py", line 30, in import_module
raise TypeError("relative imports require the 'package' argument")
TypeError: relative imports require the 'package' argument

如果我包含调试,那么我可以看到以下@runscript.py #99:检查 .scripts.mysimplescript.scripts.py

最初运行了一些 django 教程后,设置了以下内容:

./mysite/wsgi.py:os.environ.setdefault("DJANGO_SETTINGS_MODULE",  
"mysite.settings")
./manage.py:    os.environ.setdefault("DJANGO_SETTINGS_MODULE", 
"mysite.settings")
./mysite/settings.py:ROOT_URLCONF = 'mysite.urls'

关于该主题的一些讨论,例如 [1]:python 相对导入的打包和 [2]:如何在 Python 中进行相对导入?建议在外部 mysite/ 目录中添加一个 main.py。

但本质上,我仍然想通过 django-extensions 调用脚本,使用:

python manage.py runscript  <some_script>

还有一点。如果我放弃“。” 在文件夹之前,即

python manage.py runscript scripts.mysimplescript.py --script-args Testing 
123

然后我收到以下错误:

No (valid) module for script 'scripts.mysimplescript.py' found

但是会生成一个“mysimplescript.pyc”。

有人能帮助我吗?如何让 python 识别包?提前致谢。

4

3 回答 3

2

文档中的示例是将脚本另存为scripts/delete_all_questions.py,然后使用

python manage.py runscript delete_all_questions

在你的情况下,你的脚本是scripts/mysimplescript.py,所以你运行它

python manage.py runscript mysimplescript --script-args Testing 123

请注意,您使用模块名称mysimplescript,因此不应包含.py. django_extensions 应用程序假定脚本在一个scripts目录中,所以也不要包含它。

于 2016-02-05T15:35:01.793 回答
1

相对导入只能从 python 包运行。您使用相对导入的目录应该: 1. 包含一个init .py 文件 2. 可用于 PYTHONPATH(声明为路径,或具有init .py 且位于该路径上的另一个目录的子目录)

换句话说,除非你调用整个包,否则相对路径在脚本中不起作用:

$ python -m manage.py runscript mystie.scripts.mysimplescript
于 2016-02-05T16:04:32.563 回答
0

这将工作..

python manage.py runscript mysimplescript --script-args Testing 
123
于 2016-02-05T15:21:09.277 回答