3

私の状況はこの質問の状況と似ています...違いは、

私たちの python/django プロジェクトには、基本的な機能を保持するutilsというディレクトリがあります...

場合によっては、コンソールから thm を実行していくつかのモジュールをテストする必要があります。

python myproject/some_module.py

Python がutils ディレクトリから何かインポートしようとするまでは、すべて問題ありません...

from utils.custom_modules import some_function
ImportError: No module named custom_modules

私は自分のpythonパスを確認し、私たちのプロジェクトはリストにあり、プロジェクトファイルの下の各フォルダーにはファイルがあり、プロジェクトディレクトリ内でipython__init__.pyを実行すると...すべて問題ありません。それ以外の場合、pythonは独自のutilsディレクトリからインポートします...

私の同僚は問題なく sama メソッドを使用していますがImportError、私の環境ではスローされます... 私たち全員が見逃していた問題は何でしょうか?

更新:私のプロジェクトディレクトリと各サブディレクトリには__init__.pyファイルがあり、プロジェクトから他のモジュールを問題なくインポートできます...私のprocektとは異なるフォルダーにいてipythonを実行すると、そのようなインポートに問題はありません...

from someothermodule.submodule imprort blahblahblah

しかし、ユーティリティのインポートに関しては、失敗します...

UPATE 2: 問題の原因は、python パスにもあるdjangoフォルダーの下の utils ディレクトリでした...

4

2 に答える 2

6

セマンティクスについては、絶対インポートと相対インポートに関する PEP を参照してください。あなたはおそらくしたいです

from .utils.custom_modules import some_function

パッケージの最上位のファイルにいる場合。

編集:これは、パッケージ内からのみ実行できます。これには正当な理由があります。プロジェクトの一部である何かをインポートする場合、すでに Python パッケージのように扱っているため、実際には Python パッケージにする必要があります。__init__.pyこれを行うには、ファイルをプロジェクト ディレクトリに追加します。

編集 2: 質問を完全に変更しました。この問題を回避することは可能かもしれませんが、正しい方法は、組み込みパッケージと同じ方法でパックされたものを参照しないことです。の名前を変更するかutils別のパッケージのサブパッケージにする必要があるため、競合しない名前 ( などfrom mydjangoapp.utils.custom_modules import some_function) で参照できます。

于 2011-08-18T12:06:55.727 に答える
-1

stdlib モジュールの後に独自のモジュールの名前を付けないようにするようにわざわざ言うつもりはありません。

このような名前を残したい場合は、独自の utils モジュールをインポートするすべてで次のようなものを使用する必要があります。

import sys, imp

utils = sys.modules.get('utils')
if not utils: utils = imp.load_module('utils',*imp.find_module('utils/utils'))

ただし、名前を変更した後に変更しなければならないことがたくさんない限り、名前を変更することをお勧めします。

于 2011-08-18T12:02:45.117 に答える