python/django扩展:没有名为common.types的模块_
我已经使用django extensions中的“runscript”运行了一个位于“scripts”文件夹中的简单脚本。这里描述了该技术[1]()。 脚本将按如下方式成功运行:python/django扩展:没有名为common.types的模块_,python,django,python-extensions,Python,Django,Python Extensions,我已经使用django extensions中的“runscript”运行了一个位于“scripts”文件夹中的简单脚本。这里描述了该技术[1]()。 脚本将按如下方式成功运行: python manage.py runscript mysimplescript --script-args Testing 123 from common.types_ import Enum 如果我现在将脚本移动到子文件夹,那么我似乎需要指定子文件夹的完整路径: python manage.py runscr
python manage.py runscript mysimplescript --script-args Testing 123
from common.types_ import Enum
如果我现在将脚本移动到子文件夹,那么我似乎需要指定子文件夹的完整路径:
python manage.py runscript scripts.myfolder.mysimplescript --script-args Testing 123
我已经编写了一个python脚本,当直接从命令行在它自己的项目文件夹中调用时,它会成功运行。复杂脚本使用大量位于过多子文件夹中的其他脚本
我现在想使用django扩展名“runscript”在django中调用这个脚本,这意味着它是从“manage.py”所在的“mysite/”文件夹调用的。脚本“mycomplexscript.py”不在“scripts/”文件夹中,而是与子文件夹和脚本一起重新定位到单独的“myapps/”项目文件夹中
我已经展示了下面的结构,其中包括“mysite/”和“myapp/”中的一些子文件夹/文件,特别是模块“myapp/common/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_
如果明确说明了项目根目录的完整路径(+++),则可以修复此错误:
这意味着我必须编辑所有文件并相应地更改路径,如果可能的话,我希望避免这样做。
这个链接[2]:()描述了从命令行引用另一个项目,所以我意识到这可能与我试图使用django扩展名“runscript”来实现这一点无关
是否有一种方法可以解决路径差异,而不必修改所有文件?正如这里所建议的[3]:(),设置PYTHONPATH是答案吗?我检查过了,但是“echo$PYTHONPATH”当前没有返回任何内容
为冗长的描述道歉
提前感谢。我按照上面链接和[4]:()的建议尝试了sys.path.append(“my/path”),它似乎起了作用,因此现在可以识别“from”中包含的所有路径,而无需设置完整路径,如我前面所述(+++)
因此,从“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')
在脚本中硬编码此路径并不理想,因此可能可以将其作为参数之一传入。唯一的问题是,在复杂脚本中处理任何命令行参数之前,导入显示在文件的顶部,但至少我知道它在原则上是有效的。我尝试了上面链接和[4]:()推荐的sys.path.append(“我的/path”),它似乎有效,因此,现在可以识别“from”中包含的所有路径,而无需设置完整路径,如我前面所述(+++)
因此,从“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')
在脚本中硬编码此路径并不理想,因此可能可以将其作为参数之一传入。唯一的问题是,在复杂脚本中处理任何命令行参数之前,导入显示在文件的顶部,但至少我知道它在原则上是有效的。这是出于设计。您不能使用脚本中的部分路径和相对路径,python希望整个包与您的包兼容吗?我在将django从1.8.9升级到1.9时遇到了这个问题这是设计的。您不能使用脚本中的部分路径和相对路径,python希望整个包与您的包兼容吗?我在将django从1.8.9升级到1.9时遇到了这个问题
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')