1

Mercurial を使用して、Python 2.7 をセットアップした Windows マシンに Django プロジェクトを複製しました。(コマンドの有無にかかわらず)実行しようとするとmanage.py、次のエラーが発生します。

Traceback (most recent call last):
  File "C:\Users\jes.000\Documents\project\manage.py", line 30, in <module>
    import django.core.servers.basehttp
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 26, in <module>
    from django.views import static
  File "C:\Python27\lib\site-packages\django\views\static.py", line 95, in <module>
    template_translatable = ugettext_noop(u"Index of %(directory)s")
  File "C:\Python27\lib\site-packages\django\utils\translation\__init__.py", line 75, in gettext_noop
    return _trans.gettext_noop(message)
  File "C:\Python27\lib\site-packages\django\utils\translation\__init__.py", line 48, in __getattr__

    if settings.USE_I18N:
  File "C:\Python27\lib\site-packages\django\utils\functional.py", line 184, in inner
    self._setup()
  File "C:\Python27\lib\site-packages\django\conf\__init__.py", line 40, in _setup
    raise ImportError("Settings cannot be imported, because environment variable %s is undefined." %ENVIRONMENT_VARIABLE)
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.

manage.py がその環境変数を設定することになっていることを理解しています。プロジェクトがpythonパスにないため、このエラーが発生する可能性があることも理解しています...しかし、手動で追加する必要はないようです。この問題もmanage.pyで解決できるのではないでしょうか?

編集:Linuxでまったく同じことをテストしたところ、まったく同じことがわかりました。

編集: これは便利な発見です: PIP 経由で Django をインストールした場合にのみこのエラーが発生します。Ubuntu に python-django パッケージをインストールすると正常に動作します。そのため、PIP ではなく、debian パッケージが行っていることがあります。もしかしたら、debian パッケージがいくつかの環境変数を設定しているのではないでしょうか? Windowsで開発しようとしているので、それを理解する必要があります。

編集:問題は見つかったと思いますが、解決策ではありません。Ubuntu マシンで作業しているときに、PIP 経由で Django をインストールすると ( pip install django)、このプロジェクトは、指定したエラーで機能しません。新しいプロジェクト ( django-admin startproject testproject) を作成し、それが機能することを試してみるとmanage.py、作成されたフォルダーと、他のすべてを含む別のフォルダーで構成されます。このような:

+-testproject
  +-manage.py
  +-testproject
    +-__init__.py
    +-etc.

Debian パッケージ ( apt-get install python-django) をインストールすると、作業しようとしているプロジェクトが動作し、テスト プロジェクト ( django-admin startproject testproject) を作成すると、次のようなフォルダー構造になります。

+-testproject
  +-manage.py
  +-__init__.py
  +-etc.

違いに注意してください。PIP Django パッケージでは、manage.py がアプリである python モジュールの外側に配置されているように見えますが、Debian パッケージでは manage.py がモジュール内に配置されています。これは、2つのパッケージが異なるバージョンのDjangoであり、その間に構造が変更されたためだと思います.2つのパッケージが異なる方法でこれを行うことは意味がありません.

だから私の問題は、私が開発しようとしているプロジェクトが元々 Debian パッケージ化されたバージョンを使用して生成されたものであるのに対し、私の Windows マシンでは pip から Django のバージョンを使用しようとしているということです。

問題は、問題を解決する方法がわからないことです。この 'debian-package version' の manage.py は単にimport settingsを試みますが、settings.py と同じフォルダーにない場合は失敗します。しかし、Django の別の場所では、プロジェクト自体が /settings.py (django-admin の pip バージョンが使用された場合のように) ではなく、/settings.py にあることを期待しているようです ( debian-package バージョンが使用されている場合)。

調べてみると、Ubuntu リポジトリのバージョンは 1.3.1 ですが、PyPI のバージョンは 1.4 です。1.4 のリリース ノートを見てください。

以前のバージョンから「魔法」を取り除く、更新されたデフォルトのプロジェクト レイアウトと manage.py。新しいレイアウトが気に入らない場合は、代わりにカスタム プロジェクトとアプリ テンプレートを使用できます。

しかし... 1.3 レイアウトで生成されたプロジェクトは 1.4 でも動作するはずではありませんか?

4

3 に答える 3

2

これが最近のバージョンの django で変更されたかどうかはわかりませんが、デフォルトではmanage.py単純にファイルをインポートしsettings.pyてマネージャーを起動しようとします。デフォルトでは、プロジェクトを PYTHONPATH に入れるか、settings.py を DJANGO_SETTINGS_MODULE 変数に入れることが期待されます。

manage.pyこのスニペットを使用して、 を少し賢く変更できます。

管理.py

#!/usr/bin/env python
from django.core.management import execute_manager

...

import settings

import os
project = os.path.basename(os.path.dirname(__file__))
os.environ['DJANGO_SETTINGS_MODULE'] = '%s.settings' % project

if __name__ == "__main__":
    execute_manager(settings)

これで、常に明示的に settings.py ファイルへのパスが設定されるため、manage.py を任意の場所から実行できます。

于 2012-05-16T23:32:17.887 に答える
1

次のように、ファイルmanage.pyに次のコードを追加できます。

from django.conf import settings  
settings.configure()
于 2014-04-29T09:16:33.527 に答える
0

これは、1.3 と 1.4 のデフォルト レイアウトの違いによるものです。通常、Django 1.3 プロジェクトは 1.4 で動作するため、ここで別のことが起こっているため、私にはよくわかりません。問題がプラットフォームに依存しないことを確認しました。

正確な問題はわかりませんでしたが、修正を見つけました。あれは:

  1. Django 1.4 で新しいプロジェクトを作成し、その manage.py ファイルをポーチします。プロジェクト名を変更すると、このファイルは manage.py として機能します。元の manage.py が Django 1.3 を使用している同僚に残されるように、'manage14.py' という名前を付けました。
  2. プロジェクトがあったディレクトリの上のディレクトリをグローバル PYTHONPATH に追加します。これは理想的な解決策ではありませんが、プロジェクトを Django 1.4 の組織に変換しなくても、変更されていない Django 1.4 の manage.py でプロジェクトを読み込むことができました。

実用的になり次第、プロジェクトを Django 1.4 形式に変換する予定です。特にこの種の問題を回避するという観点からは、いずれにせよ優れているように思われるからです。残念ながら、同僚が PyPI を使用して Windows で使用しているのと同じバージョンになるように、Ubuntu レポジトリが 1.4 になるまで待たなければなりません。

于 2012-05-17T02:10:49.030 に答える