2016-02-08 8 views
1

Мне удалось запустить простой скрипт, расположенный в папке «скрипты», используя «скрипт» из django-extensions. Техника описана здесь [1] (https://django-extensions.readthedocs.org/en/latest/runscript.html). Сценарий будет успешно работать следующим образом:python/django-extensions ImportError: Нет модуля с именем common.types_

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

Должен ли я теперь перейдем сценарий к подпапке, то оказывается, мне нужно указать полный путь к подпапке:

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

Я написал скрипт python, который успешно запускается при вызове непосредственно из командной строки в его собственной папке проекта. Сложный скрипт использует ряд дополнительных скриптов, расположенных в множестве подпапок.

Теперь я хочу называть этот скрипт в django, используя django-extensions '' runningcript, что означает, что он вызывается из папки mysite /, где находится «manage.py». Скрипт «mycomplexscript.py» не находится в папке «scripts /», а перемещается в отдельную папку проекта «myapps /» вместе с подпапками и скриптами.

Я показал структура ниже, включает в себя 'MySite /' и некоторые из вложенных папок/файлов в 'MyApp /', в частности, модуль 'MYAPP/общее/types_':

mysite/ 
    manage.py 
    mysite/ 
     __init__.py 
     settings.py 
     urls.py 
     wsgi.py 
    scripts 
     __init__.py 
     mysimplescript.py 
    myapps/ 
     __init__.py 
     mycomplexscript.py 
     common/ 
      __init__.py 
      comparison.py 
      serialisation/ 
       __init__.py 
       serialisation.py 
       xml.py 
      types_/ 
       __init__.py 
       enum.py 

Django-extensions требует, чтобы «mycomplexscript.py» должен включать функцию «run()». Line # 6 импортирует класс от одного из проектов подпапок:

def run(*script_args): 
    import os 
    import sys 
    import time 
    from common.serialisation import XML 

При вызове сценария, возникает ошибка, потому что модуль «common.types_» не может быть расположен.

python manage.py runscript myapps.mycomplexscript --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) 
Exception while running run() in 'myapps.mycomplexscript' 
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 172, in handle 
    run_script(mod, *script_args) 
File "/usr/lib/python2.7/site-packages/django_extensions-1.6.1-py2.7.egg/ 
django_extensions/management/commands/runscript.py", line 79, in run_script 
    mod.run(*script_args) 
File "/usr/tester/SwFact/isg_cid-system_test_current/my_site/myapps/ 
mycomplexscript.py", line 9, in run 
    from myapps.common.serialisation import XML 
File "/usr/tester/SwFact/isg_cid- system_test_current/my_site/myapps/ 
common/__init__.py", line 7, in <module> 
    from comparison import Comparison 
File "/usr/tester/SwFact/isg_cid-system_test_current/my_site/myapps/ 
common/comparison.py", line 7, in <module> 
    from common.types_ import Enum 
ImportError: No module named common.types_ 

Проблематика Line # 7 в «comparison.py» выглядит следующим образом:

from common.types_ import Enum 

ошибка может быть исправлена, если полный путь к корню проекта указывается явно (+++):

from apps.common.types_ import Enum 

Это означает, что мне нужно будет отредактировать все файлы и соответственно изменить пути, которые я хотел бы избежать, если это возможно. Эта ссылка [2] :(Python: Referencing another project) описывает ссылку на другой проект из командной строки, поэтому я понимаю, что это не имеет ничего общего с тем, что я пытаюсь сделать это, используя «скрипт» django-extensions.

Есть ли способ разрешить несоответствие пути, не изменяя все файлы? Будет ли установка PYTHONPATH ответом, как предлагается здесь [3] :(How to use PYTHONPATH)? Я проверил, но «echo $ PYTHONPATH» в настоящее время ничего не возвращает.

Извинения за затянутое описание.

Заранее спасибо.

+0

Это по дизайну. Вы не можете использовать частичный и относительный путь из сценария, python хочет весь пакет –

+0

Совместимы ли ваши пакеты? У меня возникла эта проблема при обновлении 'django' с 1,8,9 до 1,9 –

ответ

0

Я пробовал sys.path.append («my/path») в соответствии с рекомендациями по ссылке выше и [4] :(Python sys.path - appending PYTHONPATH), и, похоже, это сработало, поэтому все пути, включенные в 'from', теперь распознаются без необходимости устанавливать полный путь , как я описал ранее здесь (+++).

myapps/mycomplexscript: 

# Procedures 
def run(*script_args): 
    import os 
    import sys 
    import time 
    sys.path.append('/usr/tester/SwFact/isg_cid-system_test_current/ 
    my_site/myapps') 
    from common.serialisation import XML 
    from common.task import Subscriber 
    from test_ import TestHost 
    from common.filesystem import Directory, File 
    from common.tables import Column, Condition, CSVTable, Group 
    from string import Template 
    from datetime import date, time, datetime, timedelta 
    from operator import itemgetter 

    print script_args 

Так что результат при запуске скрипта из «MySite /»:

python manage.py runscript myapps.mycomplexscript --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) 
('Testing', '123') 

Это не идеально, чтобы жестко прописать путь этого в скрипте, так что, возможно, он может быть передан в как один из аргументов. Единственная проблема заключается в том, что импорт отображается в верхней части файла, прежде чем какой-либо из аргументов командной строки обрабатывается в сложном скрипте, но, по крайней мере, я знаю, что он работает в принципе.

 Смежные вопросы

  • Нет связанных вопросов^_^