2016-04-08 12 views
3

Python 3では、コマンドラインで-mフラグを使用して任意のディレクトリをPythonパッケージとして実行したり、Pythonモジュールをそれらの相対インポートを持つディレクトリ内で実行することができました。しかし、それは、Pythonの場合のように思えません2.-mフラグはPython 2と3の間でどのように違いますか?

のは、私は次のファイル構造を持っているとしましょう:

C:\mflag 
└───pack 
     hey.py 

そしてhey.pyの内容があること:

from __future__ import print_function 

print("Hello!") 

これらの2つのコマンドの動作が異なるのはなぜですか?

+2

疑い、それはおそらく、[名前空間のパッケージ]とは何かです(https://www.python.org/dev/peps/pep-0420/)私は信じている –

+1

あなたは\ __ init__ 'パックを持っている必要があります.py'を公式パッケージにする。 Python 3は少し柔軟性があるかもしれません。 – ShadowRanger

答えて

6

これは、PEP 0420によって導入された名前空間パッケージです。特に:それはPythonの 3.2の場合のように、インポート処理中に

、輸入機械は親パスで各ディレクトリ上 反復するために継続されます。親パス内の各ディレクトリのために、「foo」という名前のモジュールやパッケージを探している間:_.pyが発見された

  • /fooの/ _ _ _ INIT場合は、通常のパッケージは をインポートして返されます。
  • /foo.{py,ycycsoso,pyd}が見つからない場合は、 モジュールをインポートして返します。拡張子の正確なリストは、 プラットフォームと、-Oフラグが指定されているかどうかによって異なります。ここにリストされているのは です。
  • /fooが見つかっていて、ディレクトリが の場合、それが記録され、親パスの次の ディレクトリでスキャンが続行されます。

  • それ以外の場合は、親パスの次のディレクトリでスキャンが続行されます。

+1

OPの明白な「* Why?*」質問に対する優れた答え。また、空の 'pack \ __ init __。py'を作成することで、OPがPython2で望む動作をすることができます。それは彼の暗黙の "* How?*"質問に答えるだろう。 –

+0

それでした!同じPEPの別の関連セクション: "暗黙的な名前空間パッケージを許可するということは、__init__.pyファイルを提供する要件を完全に破棄できることを意味します" – zayora

関連する問題