2017-04-10 4 views
2

Python3でPyDevを使用してパッケージを作成しています。私の.pyファイルの1つに相対的な単純なインポート、from . import filenameがあります。私はパッケージからインポートしたファイルは、それがうまく動作しますが、PyDevは直接そのファイルを実行すると、このエラーで失敗したことをテストするために、パッケージの外に別のファイルを使用する場合:__name__ in Python、Pydev

ImportError: attempted relative import with no known parent package 

検索の多くの後、私が見つかりました。インポートする前にコードを追加すると動作するコード:

__path__ = [""] # indicates local directory 
__package__ = ["package_name"] 

すべてが正常に動作します。しかし、そのファイルでは、私はこの行を置く:print(__name__)

出力は文字列です!

package_name 
__main__ 

私はそれがパッケージ内だと直接実行されているからといって、これは疑うが、その後、私はif __name__ == "__main__":のようなものをどのように行うのですか?私も変数がそれに割り当てられた2つの別個の文字列を持っている可能性がどのように理解していない

print(repr(__name__)) 
# output 
'package_name' 
'__main__' 

print(__name__.endswith("__main__")) 
# output 
False 
True 

print(type(__name__)) 
# output 
<class 'str'> 
<class 'str'> 

は、ここで私は__name__ VAR以上に周りめちゃめちゃにいくつかのより多くの出力です。何が起こっている?この既知のPythonの問題が... __main__として実行ファイルさ

+0

このファイルのように聞こえるのは、実際には2回実行されているということです。インポートシステムを混乱させるほど、いくつかの方法があります。 – user2357112

+0

はるかに簡単な解決策は、パッケージの内容を直接実行しようとせず、同じファイルをインポート可能なモジュールとスクリプトにしないようにすることです。 – user2357112

+0

@ user2357112これは2回実行されていますが、どのように起こる可能性がありますか?そしてあなたの他のコメントに答えて、私はこれが今私がやることだと思います。ファイルが実行可能なスクリプトである必要はありません。実行されていれば、エラーを生成しないようにするだけです。助けてくれてありがとう! – Cole128

答えて

0

彼らは指定された名前のモジュールをインポート-mフラグ(と実行している場合を除き、それらの相対的な輸入品を持っており、その__name__のようにそれを実行するために変更することはできませんデフォルトPyDevはによって__main__

だけで定期的にファイルを実行しますが、あなたはまた、(preferences > PyDev > Run > Launch modules with "python -m mod.name"を参照)、その計算されたモジュール名でファイルを実行するように依頼することができます。

個人的に、私はあなたが相対的な輸入を入れていないお勧めあなたの__main__モジュールでは(ユーザはとしてモジュールを実行することができないため)また、-mフラグで実行する必要がありますが、それがOKならば、PyDevでそのオプションを有効にすることができます。

+0

私はすでにpydevでその機能を有効にしています。これは '__main__'として実行されるファイルでもありません。エラーなしで実行できるようにしたかっただけです。しかし、この/ノーポイントの周りに簡単な方法がない場合は、@ user2357112が示唆しているように、意図したとおりにモジュールとして使用します。 – Cole128