2016-02-05 8 views
1

После нескольких лет написания на C и C++ я чувствую себя немного странно, когда дело доходит до python и django. Кажется, у меня не получается что-то простое работать. Я признаю, что ошибка обсуждалась в ряде сообщений.Python/Django TypeError: относительный импорт требует аргумента «package»

Я начал изучать некоторые учебники django, поэтому я запустил «django-admin startproject mysite», который создал папку «mysite».

Я установил django_extensions, поэтому теперь я пытаюсь использовать его «скрипт». У меня есть более сложный сценарий, который я хочу, чтобы запустить позже, но сейчас я пытаюсь вызвать простой пользовательский сценарий, который я нашел в Интернете с помощью этого механизма есть

mysimplescript.py: 

def run(*script_args): 
print script_args 

Он находится в папке «Scripts» так что моя структура выглядит следующим образом, где внешняя 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

первоначально Пробежав несколько Джанго учебников, следующие были установлены:

./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 packaging for relative imports и [2]: How to do relative imports in Python? предлагают добавить main.py во внешний mysite/каталог.

По существу, хотя, я все еще хочу, чтобы вызвать сценарий через Джанго-расширений с помощью:

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 для распознавания пакета? Заранее спасибо.

+1

вы пробовали 'питон manage.py RunScript mysimplescript'? Это похоже на пример [в документах] (http://django-extensions.readthedocs.org/en/latest/runscript.html#usage), где вы запускаете 'python manage.py runcript delete_all_polls' для запуска скриптов/delete_all_polls.py'. – Alasdair

+0

Alasdair, да, у меня есть. python manage.py runningcript mysimplescript.py --script-args Тестирование 123 Я получаю ту же ошибку: Check для mysimplescript.py Нет (действительный) модуль для скрипта mysimplescript.py найдено –

+0

Попробуйте 'mysimplescript' без' .py'. – Alasdair

ответ

0

Это будет работать ..

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

Пример in the docs это сохранить скрипт как 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, поэтому не включайте это.

+0

Alasdair, как оказалось, я ранее создал файл «delete_all_polls.py» в той же папке «scripts /», содержащей «mysimplescript.py», поэтому почему я могу получить «No (valid) module для скрипта« delete_all_polls » «найдена» при запуске «python manage.py runningcript delete_all_polls»? Интересно, что если вы временно удалите «from..import» наверху, модуль распознается, но объект «Опрос», очевидно, не распознается. –

+0

Файл "/usr/tester/SwFact/isg_cid-system_test_current/my_site/scripts/delete_all_polls.py", строка 7, в перспективе all_polls = Poll.objects.all() NameError: глобальное имя 'Опрос' не определен –

+0

Если у вас нет приложения «Опросы» с моделью «Опрос», я бы ожидал, что импорт завершится неудачно. Этот пример из документов не идеален - для Django 1.8+ у вас есть 'from polls.models import Question', если вы выполняете руководство. Для более ранних версий учебника приложение будет иметь более низкий размер, т. Е. 'From polls.models import Poll'. Если вы не импортируете или не определяете 'Poll', то' NameError' тоже не удивительно. – Alasdair

0

Относительный импорт может выполняться только из пакета python. Каталог используется относительным импорт Шоул: 1. Содержит инициализации файла .py 2. Доступен в PYTHONPATH (объявивший в качестве пути, или подкаталога другого каталога, который имеет инициализации .py и находится на путь)

другими словами, относительный путь не будет работать в скрипте, если вы звоните весь пакет:

$ python -m manage.py runscript mystie.scripts.mysimplescript 
Смежные вопросы