回答:
os.path面白い方法で動作します。それはosサブモジュールを持つパッケージのように見えますpathが、実際にosは、sys.modules注入するために魔法をかける通常のモジュールですos.path。ここで何が起こるかです:
Pythonが起動すると、一連のモジュールがに読み込まれsys.modulesます。これらはスクリプト内のどの名前にもバインドされていませんが、何らかの方法でインポートすると、作成済みのモジュールにアクセスできます。
sys.modulesモジュールがキャッシュされる辞書です。モジュールをインポートするときに、すでにどこかにインポートされている場合は、インスタンスがに保存されていsys.modulesます。osPythonの起動時に読み込まれるモジュールの1つです。そのpath属性をOS固有のパスモジュールに割り当てます。
サブモジュールのsys.modules['os.path'] = pathように " import os.path" を実行できるように注入します。
私が考える傾向があるos.pathとして、私が使用するモジュールではなく、中のものosモジュール、それはありませんので、にもかかわらず、本当にというパッケージのサブモジュールos、私はそれが1であるように、一種のそれをインポートして、私はいつもやりますimport os.path。これは、os.path文書化されている方法と一致しています。
ちなみに、この種の構造は、多くのPythonプログラマーがモジュールとパッケージ、およびコード編成について多くの初期の混乱を招くと思います。これには2つの理由があります
osパッケージと考えimport osて、サブモジュールを実行してアクセスできることがわかっている場合os.path、インポートせずに実行できずimport twisted、自動的にアクセスできないことに驚かれるかもしれませんtwisted.spread。
これはos.name通常のことであり、文字列でありos.path、モジュールです。私は常にパッケージを空の__init__.pyファイルで構造化しているため、同じレベルで常に1種類のものが存在します。それは、モジュール/パッケージまたはその他のものです。いくつかの大きなPythonプロジェクトはこのアプローチを採用しており、より構造化されたコードを作成する傾向があります。
import os.path自分でやって、それがより良い方法だと思います。「これはos.pathがどのようにドキュメント化されているかと一貫しています」ということは、docs.python.org/library/os.path.htmlにあるドキュメントで独自のページが与えられることを意味しました。
Tim PetersによるPEP-20によると、「明示的なものは暗黙的なものよりも優れています」と「読みやすさの数」。osモジュールから必要なものがすべての下にあるos.path場合import os.pathは、より明確にして、あなたが本当に気にしていることを他の人に知らせます。
同様に、PEP-20も「シンプルな方が複雑な方がいい」と言っているので、より一般的なos傘の下にあるものも必要な場合は、こちらをお勧めしますimport os。
import os意味のある方法で「シンプル」であることが本当にどうであるかはわかりません。単純な!=短い。
import os 、そしてimport os.pathあなたが例えば必要があるなら、それはダフですos.getcwd()os.path.isfile()
決定的な答え:import osそしてを使用してくださいos.path。import os.path直接しないでください。
モジュール自体のドキュメントから:
>>> import os
>>> help(os.path)
...
Instead of importing this module directly, import os and refer to
this module as os.path. The "os.path" name is an alias for this
module on Posix systems; on other systems (e.g. Mac, Windows),
os.path provides the same operations in a manner specific to that
platform, and is an alias to another module (e.g. macpath, ntpath).
...
os.path存在しないモジュールのドキュメントではなく、のドキュメントであることに注意してくださいposixpath。
"Instead of importing this module directly, import os and refer to this module as os.path."に位置しているposixpath.py(またはmacpath.py、 ntpath.pyなど)。それらが意味することは、import posixpath(うまくいく)べきではなくos、より良い移植性のために経由でモジュールをインポートするべきだということだと私はかなり確信しています。私は、彼らがいるかどうかに勧告を与えるつもりはないと思うimport osか、import os.path好ましいです。
興味深いことに、os.pathをインポートすると、すべてのosがインポートされます。対話型プロンプトで次のことを試してください。
import os.path
dir(os)
結果は、単にosをインポートした場合と同じになります。これは、os.pathが、使用しているオペレーティングシステムに基づいて別のモジュールを参照するため、Pythonがosをインポートして、パスに読み込むモジュールを決定するためです。
一部のモジュールでは、「import foo公開しない」と言っているfoo.barので、実際には特定のモジュールの設計に依存していると思います。
一般に、必要な明示的なモジュールをインポートするだけで、わずかに速くなるはずです。私のマシンでは:
import os.path: 7.54285810068e-06秒
import os: 9.21904878972e-06秒
これらの時間はかなり無視できるほど十分に近いです。プログラムはos、現在または後で他のモジュールを使用する必要がある場合があるため、通常は2マイクロ秒を犠牲にimport osして、後でこのエラーを回避するために使用するのが理にかなっています。私は通常、全体としてosをインポートするだけですがimport os.path、技術的により効率的で、os使用する必要があるモジュールの唯一の部分であるコードの読者に伝える方を好む理由を理解できます。それは本質的に私の頭の中のスタイルの質問に要約されます。
from os import path速度に問題がある場合、pathの呼び出しがさらに速くなります。
ここでosは常識が機能します。はモジュールでありos.path、モジュールでもあります。したがって、使用するモジュールをインポートするだけです。
osモジュールで機能を使用する場合は、をインポートしosます。
os.pathモジュールで機能を使用する場合は、をインポートしos.pathます。
両方のモジュールで機能を使用する場合は、両方のモジュールをインポートします。
import os
import os.path参考のため:
Lib / idlelib / rpc.pyはを使用osしてインポートしosます。
Lib / idlelib / idle.pyはを使用os.pathしてインポートしos.pathます。
Lib / ensurepip / init .pyは両方を使用し、両方をインポートします。