2016-07-16 6 views
0

私はPython 3 Modules tutorialに続き、絶対的または相対的なイントラパッケージインポートは動作しません。モジュールとイントラパッケージのインポートに関する公式のPython 3チュートリアルを複製しましたが、引き続きImportError例外とSystemError例外を受け取りました

具体的には、チュートリアルのプロジェクト構造を複製しました。 soundフォルダは私の家の/home/user/ディレクトリにあります。すべてのプロジェクトファイル(filters/vocoder.pyおよびeffects/surround.pyを除く)は空で、touchを使用して生成されています。命令filters/vocoder.py 1として

sound/       Top-level package 
     __init__.py    Initialize the sound package 
     formats/     Subpackage for file format conversions 
       __init__.py 
       wavread.py 
       wavwrite.py 
       aiffread.py 
       aiffwrite.py 
       auread.py 
       auwrite.py 

     effects/     Subpackage for sound effects 
       __init__.py 
       echo.py 
       surround.py 
       reverse.py 

     filters/     Subpackage for filters 
       __init__.py 
       equalizer.py 
       vocoder.py 
       karaoke.py 

含まれています。このファイルを実行すると

from sound.effects import echo 

、それはインポートエラーになり:

[email protected]:~/sound$ python filters/vocoder.py 
Traceback (most recent call last): 
    File "filters/vocoder.py", line 1, in <module> 
    from sound.effects import echo 
ImportError: No module named 'sound' 

[email protected]:~/sound$ cd filters/ 

[email protected]:~/sound/filters$ python vocoder.py 
Traceback (most recent call last): 
    File "vocoder.py", line 1, in <module> 
    from sound.effects import echo 
ImportError: No module named 'sound' 

同様に、私は次の行のそれぞれを実行しましたeffects/surround.pyのコードを別に(私は#の行にコメントしてスクリプトを再実行しました):

012私は間違って何をやっている

[email protected]:~/sound$ python effects/surround.py 
Traceback (most recent call last): 
    File "effects/surround.py", line 1, in <module> 
    from . import echo 
SystemError: Parent module '' not loaded, cannot perform relative import 

[email protected]:~/sound$ cd effects/ 

[email protected]:~/sound/effects$ python surround.py 
Traceback (most recent call last): 
    File "surround.py", line 1, in <module> 
    from . import echo 
SystemError: Parent module '' not loaded, cannot perform relative import 

、なぜ私は絶対的および相対的輸入は私のパッケージで動作させることはできません。で結果を実行したとき

from . import echo 
from .. import formats 
from ..filters import equalizer 

?私は、チュートリアルを見ていた

mkdir ~/sound 
touch ~/sound/__init__.py 

mkdir ~/sound/formats 
touch ~/sound/formats/__init__.py 
touch ~/sound/folder/wavread.py 
touch ~/sound/folder/wavwrite.py 
touch ~/sound/folder/aiffread.py 
touch ~/sound/folder/aiffwrite.py 
touch ~/sound/folder/auread.py 
touch ~/sound/folder/auwrite.py 

mkdir ~/sound/effects 
touch ~/sound/effects/__init__.py 
touch ~/sound/folder/echo.py 
touch ~/sound/folder/surround.py 
touch ~/sound/folder/reverse.py 

mkdir ~/sound/filters 
touch ~/sound/filters/__init__.py 
touch ~/sound/folder/equalizer.py 
touch ~/sound/folder/vocoder.py 
touch ~/sound/folder/karaoke.py 


echo "from sound.effects import echo" >> ~/sound/filters/vocoder.py 

echo "from . import echo" >> ~/sound/effects/surround.py 
echo "from .. import formats" >> ~/sound/effects/surround.py 
echo "from ..filters import equalizer" >> ~/sound/effects/surround.py 
+0

は、Pythonライブラリの検索であなたの '/ホーム/ user'ディレクトリですパス?あなたがリンクしたドキュメントには次のように書かれています: "パッケージをインポートするとき、Pythonはsys.path上のディレクトリを検索し、パッケージのサブディレクトリを探します。 'sound'を含むディレクトリが' sys.path'にない場合、 'sound'は見つかりません。 – BrenBarn

+0

わかりませんが、どうすれば確認できますか?'printenv PYTHONPATH'を実行しても結果は表示されませんでした。 – Greg

+0

Pythonインタプリタの内部から 'import sys'と' print sys.path'を実行できます。 '/ home/mypythonstuff'のようなディレクトリを作成し、それをPYTHONPATHに追加したいと思うでしょう。あるいは、[per-user site-packages directory](https://www.python.org/dev/peps/pep-0370/)を使うこともできます。これはUnix系のシステムでは〜/ .local/lib/python3.5'となります。 – BrenBarn

答えて

0

:以下

は、プロジェクトを複製役立つはずスクリプトです。 I を読まないでください from sound.effects import echofilters/vocoders.pyからそのまま動作するはずです。何がチュートリアルであっと言うことです:ユーザーは、現在のディレクトリから soundディレクトリを参照することができているかのよう

Users of the package can import individual modules from the package, for example:

import sound.effects.echo 

は、だからそれは次のようになります。コメントのいくつかと同様に、ユーザーはsoundと同じディレクトリにいるか、soundディレクトリをPATH変数に追加する必要があります。このように:

import sys 
sys.path.append(<path to sound>) 
from sound.effects import echo 

も参照してください:Import a module from a relative path

さらにチュートリアルの下、彼らはあなたがintra-package referencesある、やろうとしているものに触れます。あなたのPATHsoundを追加せずに、この技術を使用することができます。

たとえば、あなたのfilters/vocoders.pyモジュールから、これはechoをインポートするために動作するはずです:

from ..effects import echo 
+0

あなたの答えとは対照的に、このような方法でモジュールをインポートすることは、チュートリアルのとおり、間違いなく可能です: "例えば、モジュールsound.filters.vocoderがsound.effectsパッケージのechoモジュールを使用する必要がある場合、sound.effects import echoから使用することができます。 " これもテストして、BrenBarnの答えの後に動作しました。 – Greg

関連する問題