4

2 つの Python パッケージがあり、一方を他方にインポートする必要があります。ディレクトリ構造は次のようになります。

workspace/
  management/
    __init__.py
    handle_management.py
    other_management.py
  utils/
    __init__.py
    utils_dict.py

utilsファイル内のプロジェクトから機能をインポートしようとしていhandle_management.pyます:

import utils.utils_dict

実行しようとするとエラーが発生しますhandle_management.py:

ImportError: No module named utils.utils_dict

この問題を解決する方法について多くのことを読みましたが、うまくいく解決策が見つからないようです。

相対パスからモジュールをインポートすることから始めました-該当する解決策を試しましたが、どれも機能しませんでした。

workspace/経由で利用可能にする唯一の解決策はありますsite_packagesか? もしそうなら、これを行う最善の方法は何ですか?

編集:

に を追加しようとしましたが/home/rico/workspace/PYTHONPATHうまくいきませんでした。

編集2:

私は klobucar のソリューションをうまく使用できましたが、このユーティリティは他のいくつかの開発者によって使用される予定であるため、一般的なソリューションとしては機能しないと思います。Python の一般化を使用して、各ユーザーの相対パスを特定できることはわかっています。もっとエレガントな解決策があるように感じます。

最終的に、このスクリプトは cron 経由で実行され、複数の Python プロジェクトで単体テストが実行されます。これは、開発中の統合テストを確実にするために、各開発者も利用できるようになります。

これをもっと一般化できるようにする必要があります。

編集3:

申し訳ありませんが、私が達成しようとしていることに対して、これらのソリューションはどれもあまり好きではありません。貴重なご意見に感謝いたします。一時的な修正として使用しています。site_packages完全な修正として、ディレクトリに追加されるスクリプトを追加することを検討しますPYTHONPATH。これは、複数のマシンと複数の開発者に必要なものです。

完全なソリューションを構築したら、私が行ったことをここに投稿し、ソリューションとしてマークします。

編集4:

この質問で自分のニーズをうまく表現できなかったように感じます。以下の回答は、この質問にうまく対処していますが、私の実際のニーズではありません。その結果、別の投稿で質問を再構成しました。私はこれを編集することを検討しましたが、以下の回答 (他の人にとって非常に役立つでしょう) は変更にとって意味がなく、場違いで無関係に見えるでしょう.

この質問の改訂版については、Python パッケージをユニバーサルにインポートできないを参照してください。

4

3 に答える 3

3

2 つの解決策があります。

ワークスペースを PYTHONPATH に入れるか:

import sys
sys.path.append('/path/to/workspace')

from utils import utils_dict

(workspace 内でスクリプトを実行している場合、つまり handle_management をインポートしている場合、ほとんどの場合、workspace は既に PYTHONPATH にあり、それを行う必要はありませんが、ここではそうではないようです)。

または、ワークスペース ディレクトリに空の (またはそうでない)__init__.pyファイルを追加して、「ワークスペース」をパッケージにします。それで:

from ..utils import utils_dict

PYTHONPATH に「utils」という別のモジュールがあると問題が発生するため、2 番目の方法をお勧めします。

それとは別に、あなたはここで間違ってインポートしています: import utils.utils_dict.py. ファイルの拡張子「.py」を含める必要はありません。ファイルをインポートしているのではなく、モジュール(またはフォルダーの場合はパッケージ)をインポートしているため、そのファイルへのパスは必要ありません。その名前が必要です。

于 2012-05-14T16:59:21.533 に答える
0

あなたがする必要があるのはあなたのインポートパスにワークスペースを追加することです。これを行うラッパーをワークスペースに作成するか、ワークスペースを環境変数としてPYTHONPATHに配置します。

import sys
# Add the workspace folder path to the sys.path list
sys.path.append('/path/to/workspace/')

from workspace.utils import utils_dict
于 2012-05-14T16:46:06.590 に答える
0

PYTHONPATH に "workspace/" を入れて、検索時にその下のパッケージを利用できるようにします。

これは、シェル プロファイルから実行できます (*nix を使用している場合、または Windows の環境変数を使用している場合)。

たとえば、OSX では ~/.profile に追加できます (ワークスペースがホーム ディレクトリにある場合):

export PYTHONPATH=$HOME/workspace:$PYTHONPATH

もう 1 つのオプションは、virtualenvを使用して、プロジェクト エリアを独自の包含環境にすることです。

于 2012-05-14T16:42:52.720 に答える