2017-01-01 8 views
1

私は同じ場所に3つのスクリプトを持っているが、輸入インポートモジュールPythonのモジュール

class radio(object): 
    '''parent class''' 

私はinterface.pyを実行しようとしています:

私はそのターンに、このインポートを持って playlist.py
if __name__ == "__main__": 
    from playlist import * 

from radio import radio 

が、私はinterface.pyを実行すると、私は次のエラーを取得する:

私は python 2.xを使用

ImportError: cannot import name radio

。どうしましたか?

+0

ここで示した設定を使用して問題を再現することはできません。あなたが示した3つのファイルを作成して、表示した内容(空の '__init __。py')に加えて、' interface.py'をエラーなく実行できます。ファイルの一つに何か他のことが起こっていると思われます。あるいは、おそらく、別の場所にある 'radio.py'というファイルがあります。 – BrenBarn

答えて

2

あなたの状況についての説明では、重要な部分は省いています。これらのモジュールが存在するパッケージです。彼らはfooパッケージに住んでいる場合たとえば、状況は次のようになります。その意味で

foo/ 
    __init__.py 
    interface.py 
    radio.py 
    playlist.py 

radioモジュールから名前をインポートするplaylistモジュール用の2つの一般的な方法があります。

# 1. Fully qualified. 
from foo.radio import radio 

# 2. Relative import. 
from .radio import radio 

2番目の方法は、あいまいさの余地がないため、強くお勧めします。

また、実行方法についてもお伝えしていません。interface.pyこれらの詳細は、輸入状況にも影響を与える可能性があります。

パッケージでコードを整理する場合は、通常の プロジェクト構造に従う必要があります。このレイアウトでは、プロジェクト ルートで作業する傾向があります。また、適切なsetup.pyファイルが必要です。ここに表示されている設定は次のとおりです。

# ---- 
# Directory layout. 
some_project/ 
    foo/ 
     __init__.py 
     interface.py 
     playlist.py 
     radio.py 
    setup.py 

    # You work at this level. 

# ---- 
# interface.py 

from playlist import radio 

def main(): 
    print radio 

# ---- 
# playlist.py 

from .radio import radio 

# ---- 
# radio.py 

radio = 123 

# ---- 
# setup.py 

from setuptools import setup 

setup(
    name  = 'foo', 
    version = '1.0', 
    zip_safe = False, 
    packages = ['foo'], 
    entry_points = { 
     'console_scripts': [ 
      'foobar = foo.interface:main', 
     ], 
    }, 
) 

# ---- 
# Install stuff for dev work (ie in "editable" mode). 
pip install -e . 

# ---- 
# Run the command line entry point. 
foobar 
+0

は 'python 3.x'の' dot'notationではありませんか?私は '2.x'です。私があなたの言うことをすれば、私は 'ValueError:非パッケージで相対的なインポートを試みました'を得ます。すべてのファイルはrootにあります。 –

+0

相対インポートはPython 2と3で機能します。 – FMc

+0

パッケージでコードを整理する場合は、標準的なプロジェクト構造に従う必要があります。すべてをルートディレクトリに置き、ルートからコードを実行することは、さまざまな理由からうまく機能しません。まず、Pythonがルートディレクトリをパッケージとして解釈しないことから始まります。このトピックにはさまざまなリソースがありますが、ここには1つあります:https://www.jeffknupp.com/blog/2013/08/16/open-sourcing-a-python-project-the-right-way/ – FMc

0

私はあなただけのファイルと同じディレクトリにある

__init__.py 

と呼ばれる空のファイルを作成する必要があると思います。これにより、Python2はこのディレクトリからインポートすることができます。 コードを使用してください。

+0

それは既にそこにあります、私はそれを言及するのを忘れて、今私の編集でそれをしました。ごめんなさい。 –

+1

万が一、輸入品がありますか? – Shobeir