Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在更新django db的脚本中,我根据脚本的路径得到ImportError_Python_Django - Fatal编程技术网

Python 在更新django db的脚本中,我根据脚本的路径得到ImportError

Python 在更新django db的脚本中,我根据脚本的路径得到ImportError,python,django,Python,Django,我想要一个python脚本来更新django数据库。我有一个当它是django项目目录的顶层时可以正常工作,但当它在子目录中时会因ImportError而失败 虽然我的项目比这更复杂,但下面是我的项目目录的简化示例: myproj/ ├── settings.py ├── manage.py ├── bin/ ├── myapp/ │   ├── __init__.py │   ├── models.py │   ├── templ

我想要一个python脚本来更新django数据库。我有一个当它是django项目目录的顶层时可以正常工作,但当它在子目录中时会因ImportError而失败

虽然我的项目比这更复杂,但下面是我的项目目录的简化示例:

    myproj/
    ├── settings.py
    ├── manage.py
    ├── bin/
    ├── myapp/
    │   ├── __init__.py
    │   ├── models.py
    │   ├── templates/
    │   ├── urls.py
    │   ├── views.py
    └── myproj.db
包myproj位于python路径中,在settings.py中,INSTALLED_APPS元组列出了“myapp”

现在,如果我有这样一个简单的python脚本

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproj.settings'

from django.contrib.auth.models import User

print User.objects.filter(username='foo').count()
我将这个test.py命名为,并将它放在myproj/的顶部,然后从myproj/run的内部 python test.py 一切正常,例如,如果我有一个名为“foo”的用户,则会打印1

如果我简单地将test.py移动到myproj/bin/中,并从myproj/bin内部执行 python test.py 我得到了一系列这样的错误

    Traceback (most recent call last):
      File "test.py", line 6, in <module>
        print User.objects.filter(username='foo').count() 
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 155, in filter
        return self.get_query_set().filter(*args, **kwargs)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 669, in filter
        return self._filter_or_exclude(False, *args, **kwargs)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 687, in _filter_or_exclude
        clone.query.add_q(Q(*args, **kwargs))
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py", line 1271, in add_q
        can_reuse=used_aliases, force_having=force_having)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py", line 1139, in add_filter
        process_extras=process_extras)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py", line 1325, in setup_joins
        field, model, direct, m2m = opts.get_field_by_name(name)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/options.py", line 351, in get_field_by_name
        cache = self.init_name_map()
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/options.py", line 380, in init_name_map
        for f, model in self.get_all_related_m2m_objects_with_model():
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/options.py", line 469, in get_all_related_m2m_objects_with_model
        cache = self._fill_related_many_to_many_cache()
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/options.py", line 483, in _fill_related_many_to_many_cache
        for klass in get_models(only_installed=False):
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 197, in get_models
        self._populate()
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 72, in _populate
        self.load_app(app_name, True)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 94, in load_app
        app_module = import_module(app_name)
      File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py", line 35, in import_module
        __import__(name)
    ImportError: No module named myapp
我不知道该如何看待这些错误。他们没有真正弄清楚出了什么问题。django可能正在使用自己的导入函数,并且可能受到python脚本和settings.py文件的相对位置的影响

有什么见解吗?

问题在于这一行:os.environ['DJANGO\u SETTINGS\u MODULE']='myproj.SETTINGS'

当脚本在myproj/之外时,PYTHON_路径从myproj/之外开始,因此myproj是一个有效的包

当脚本位于myproj/内时,PYTHON_路径从myproj/内开始,因此myproj不再是有效的包

修复方法是从脚本内部显式设置PYTHON_路径

然而


您应该做的是将脚本转换为一个脚本,以便您可以运行python manage.py myscript,并确保Django在运行代码之前已完成所有必要的初始化和检查。

myapp是否在已安装的应用程序中?myapp在已安装的应用程序中正确列出。相关:精彩!我在脚本中附加了sys.path,这就解决了它。至于管理指挥,我没有想到这一点。最终,我希望自动运行我提到的git钩子或cron作业中的脚本,而不是命令行中的脚本。我不确定使用python manage.py运行它是否正确。通过将脚本创建为管理命令,您可以获得一些优势,例如,自动利用当前激活的设置see-settings=cmd行参数manage.py,以及以标准方式从django内部调用该脚本的能力。通常认为将脚本制作成管理命令是最佳实践。