2016-10-30 19 views
1

Pythonでモジュールをインポートする際にいくつかの問題があります。これは私が私のapp.pyではこの機能__init__.pyからのインポートメソッド

def want_to_be_run_elsewhere(): 
    pass 

を持っている私のルート__init__.pyでは私のフォルダ構造

my_app/ 
    app.py 
    __init__.py (I want to import a function from this file) 
    folder1/ 
     __init.py 
     method1.py 
    folder2/ 
     __init__.py 
     method.py 

ですが、私はこの機能をインポートして、私は自分のアプリケーションを起動したときにそれを実行したいが、私それをどうするかわかりません。

from my_app import want_to_be_run_elsewhere 

これは私が言うことができるものから、MY_APP

という名前のモジュールをスローしていない、私はので、多分それはのsys.path関連する可能性があり、すべての必要な__init__.pyのファイルを持っていますか?

私はここでいくつかの同様のスレッドを読みましたが、私はこれを解決することができませんでした。

+0

'my_app /'の中に 'app.py'と' __init __。py'がありますか? –

+0

汚れて申し訳ありません。 'app.py'と' __init __。py'はmy_app /内にあり、 'app.py'は私のエントリーポイントです –

+0

FWIW、' __init __。py'ファイル内に関数を定義するのは普通ではありません。それらは通常は空であるか、単に '__all__'リストを持っています。 –

答えて

0

通常、あなたがapp.pyを呼び出しているので、これは、ここでは動作しません

from . import want_to_be_run_elsewhere 

のようなインポートを行うだろう。 my_app.appをインポートすると、それはモジュールの一部です。あなたがそれを呼び出すなら、それはそうではありません。それが使用しているモジュールからのインポートは、.は動作しません。

app.pymy_appの外に移動してモジュールから削除し、再度インポートを実行できます。

それとも、私はあなたが実際にpip install -e my_app/を持っている場合

from my_app import want_to_be_run_elsewhere 

にのみ機能します信じてapp.py

from __init__ import want_to_be_run_elsewhere 

を使用することができます。そうすればうまくいくはずです。

+0

また、 'app.py'をパッケージ内のモジュールとして起動します:上のdir ** ** my_app'から、' python -m my_app.app'または 'python3 -m my_app.app '。 http://stackoverflow.com/a/11536794/674064 –

+0

興味深い!これを試す必要があります –

+1

'__init__ import ...'を使用するための提案を削除したいと思います。物事を行う正しい方法ではありません。サブモジュール内のコードの一部がパッケージ名に依存する場合(例えば、 'pickle'や' shleve'などのモジュールを使用してそのソリューションを使用してデータを読み取ることができない場合)、コードを壊すことさえあります。 – Bakuriu

関連する問題