0

私はこれがばかげた質問であることを知っていますが、私は困惑しています。私のディレクトリ構造は次のようになりました。

-src
  |
  -module.py
  -program.py

これが私のディレクトリ構造であるとき、私はプログラムからモジュールを参照し、すべてが順調でした。

その後、ディレクトリ構造を次のように変更しました。

-src
  |
  -__init.py
  -module.py
  |
  -programDir
    |
    -__init.py
    -program.py

もちろん、プログラムからモジュールにアクセスすることはできません。srcをパッケージとして参照するにはどうすればよいですか。私は作成しようとしました

__init__.py 

srcディレクトリにファイルがありますが、運がありません。

Moar deets:program.pyで試したステートメントをインポートします:

import module

from src import module

最初のものは、他のモジュールとプログラムが同じディレクトリにあるときに機能しました。

私が得ているエラー:

ImportError: No module named module

念のために言っておきますが、いいえ、私のモジュールとプログラムはモジュールまたはプログラムとは呼ばれていません

更新:program.pyファイルでこれを試しました:

from ...src import module

from ..src import module

両方が私に与えています:

ValueError: Attempted relative import in non-package
4

6 に答える 6

2

手始めに、ドキュメントの「Python の検索パスを変更する」というエントリを読むことをお勧めします。

一部の人は眉をひそめるかもしれませんが、プログラム内からPYTHONPATHを変更したい場合は、ドキュメントの標準モジュールエントリに従って、sys.path.append メソッドを使用できます。

import sys
sys.path.append('..')
import module
于 2011-02-24T21:23:03.063 に答える
1

これを解決するためにPEP 328を使用できませんでしたか?

于 2011-02-24T22:10:16.927 に答える
0

または を使用してprogram.py直接実行する場合、のディレクトリは PYTHONPATH にある必要があります。これは、たとえば に保持されているヘルパー シェル スクリプトを使用して実現でき、次のようになります。python program.py#!module.pyimport moduleprogramDir

#!/bin/bash

script_dir=`dirname $0`
# Add the script's parent directory to the PYTHONPATH
export PYTHONPATH=$PYTHONPATH:$script_dir/..

python $script_dir/program.py

もう 1 つの、おそらくより良い方法はprogram.py、" " 関数をエクスポートし、次のようなmain()ヘルパー python スクリプトを作成することです。src/program

#!/usr/bin/env python
from programDir.program import main
main()

この場合、 で相対インポートを使用できるsrc/programDir/program.pyため、これは機能するはずです。

from .. import module
于 2011-02-24T21:07:05.433 に答える
0

Python のsys.path最初のエントリは '' であるため、最初のものは機能しました。これは、Python インタープリターを実行した現在の作業ディレクトリでモジュール名を検索することを意味します。

あなたが抱えていると思われる問題は、にあるディレクトリがsrcPYTHONPATH に設定されていないことです。したがって、PYTHONPATH 環境変数を明示的に設定することができます。

以下は、bash を使用した例です。

export PYTHONPATH=PATH_TO_SRC:${PYTHONPATH}

次に、通常どおりプログラムを実行します

sys.path別のアプローチは、プログラムの実行時に追加することで明示的に設定できることです。

したがって、あなたprogram.pyは次のようになります:

if __name__ == '__main__':
    import os
    import sys
    sys.path.append(os.path.dirname(os.path.dirname(__file__)))
    your_main_function()

最後に、本格的な python 開発では、これらのほとんどを処理してくれるvirtualenvvirtualenvwrapperを検討する必要があります。

于 2011-02-24T21:09:35.603 に答える
0

ディレクトリをパッケージとして解釈するには、に追加__init__.pyする必要があります。/programDirパッケージが作成されると、パッケージの内容をインポートできます。

したがって、あなたの場合、 が にある場合/srcは、PYTHONPATHmodule.pyインポートできprogram.pyますfrom programDir import program

于 2011-02-24T21:10:01.360 に答える
0

プログラムをパッケージの一部として使用する場合、次のような別の python モジュールで

import src.programDir.program as p

p.some_method()

src を使用してパッケージを作成していると仮定すると、program.py で相対インポートを使用できます ( __init__.pysrc と programDir の両方で)。

from .. import module

そうでない場合、たとえば、コマンド ラインから program.py を呼び出している場合は、sys.pathインポートする前に、または PYTHONPATH 環境変数を変更して、src を含むディレクトリを検索パスに追加する必要があります。

于 2011-02-25T03:41:54.887 に答える