2016-02-08 22 views
1

我已經設法使用django-extensions中的'runscript'運行位於'scripts'文件夾中的簡單腳本。該技術在此處描述[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的'runscript'調用這個腳本,這意味着它是從'manage.py'所在的'mysite /'文件夾中調用的。腳本'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擴展需要'mycomplexscript.py'必須包含'run()'函數。 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_ 

在「comparison.py」問題的行#7如下:

from common.types_ import Enum 

可以如果完整路徑項目的根陳述被固定的錯誤明確地(+++):

from apps.common.types_ import Enum 

這意味着我將不得不編輯所有文件並相應地更改路徑,如果可能,我想避免這種情況。 這個鏈接[2] :(:Python: Referencing another project)描述了從命令行引用另一個項目,所以我意識到這可能與我試圖通過使用django-extensions的'runscript'來做到這一點無關。

有沒有一種方法可以解決路徑不一致問題,而無需修改所有文件?將設置PYTHONPATH作爲答案,這裏建議[3] :(How to use PYTHONPATH)?我檢查,但'echo $ PYTHONPATH'目前不會返回任何東西。

道歉的囉嗦描述。

在此先感謝。

+0

這是設計。你不能使用腳本中的部分和相對路徑,python需要整個包 –

+0

你的包是否兼容?將'django'從1.8.9升級到1.9時,我遇到了這個問題 –

回答

0

我試過sys.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') 

這不是理想有硬編碼的路徑這裏面的腳本,所以也許它可以被傳遞作爲論據之一。唯一的問題是導入出現在文件的頂部,在複雜腳本中處理任何命令行參數之前,但至少我知道它原則上工作。

相關問題