「import os.path」または「import os」を使用する必要がありますか?


139

公式ドキュメントによると、os.pathはモジュールです。したがって、それをインポートする好ましい方法は何ですか?

# Should I always import it explicitly?
import os.path

または...

# Is importing os enough?
import os

os作品のインポート」には答えないでください。私も知っています。Python2.6の時点では、現在も動作しています。私が知りたいのは、この問題に関する公式の勧告です。したがって、この質問に答える場合は、参考文献投稿してください

回答:


157

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つの理由があります

  1. osパッケージと考えimport osて、サブモジュールを実行してアクセスできることがわかっている場合os.path、インポートせずに実行できずimport twisted、自動的にアクセスできないことに驚かれるかもしれませんtwisted.spread

  2. これはos.name通常のことであり、文字列でありos.path、モジュールです。私は常にパッケージを空の__init__.pyファイルで構造化しているため、同じレベルで常に1種類のものが存在します。それは、モジュール/パッケージまたはその他のものです。いくつかの大きなPythonプロジェクトはこのアプローチを採用しており、より構造化されたコードを作成する傾向があります。


すばらしい、非常に有益な答え!おめでとう!質問に直接答えるものではありませんが、役立つ詳細がたくさんあります。しかし、「これはos.pathがどのようにドキュメント化されているかと一致しています」について詳しく説明してもらえますか?Chris Hulanが言ったように、os.walk()の例はos.pathではなくosだけをインポートします。
DenilsonSáMaia

3
@Denilson、それは直接的な答えを含みます:私はいつもimport os.path自分でやって、それがより良い方法だと思います。「これはos.pathがどのようにドキュメント化されているかと一貫しています」ということは、docs.python.org/library/os.path.htmlにあるドキュメントで独自のページが与えられることを意味しました
マイクグラハム

1
うわー、os.py確かにに注入しsys.modules['os.path']ます。これがfrom os.path import something実際に機能する理由です。これがいつ導入され、ソースが確認されたのか、興味がありました。面白い事実:これは1999年のもので、最初にPython 1.5.2に含まれています。元のコミットはこちらです。
Bluehorn、

29

Tim PetersによるPEP-20によると、「明示的なものは暗黙的なものよりも優れています」と「読みやすさの数」。osモジュールから必要なものがすべての下にあるos.path場合import os.pathは、より明確にして、あなたが本当に気にしていることを他の人に知らせます。

同様に、PEP-20も「シンプルな方が複雑な方がいい」と言っているので、より一般的なos傘の下にあるものも必要な場合は、こちらをお勧めしますimport os


2
import os意味のある方法で「シンプル」であることが本当にどうであるかはわかりません。単純な!=短い。
マイクグラハム

14
私はそれをもっと指摘しようとしていましたimport os 、そしてimport os.pathあなたが例えば必要があるなら、それはダフですos.getcwd()os.path.isfile()
ニックT

15

決定的な答え:import osそしてを使用してくださいos.pathimport 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).
...

13
os.path存在しないモジュールのドキュメントではなく、のドキュメントであることに注意してくださいposixpath
wRAR 2013年

18
かなり誤解を招くかもしれませんが、それはdocstringが解釈されることを意図していると私が考える方法ではまったくありません。文があることに留意してください"Instead of importing this module directly, import os and refer to this module as os.path."に位置しているposixpath.py(またはmacpath.pyntpath.pyなど)。それらが意味することは、import posixpath(うまくいく)べきではなくos、より良い移植性のために経由でモジュールをインポートするべきだということだと私はかなり確信しています。私は、彼らがいるかどうかに勧告を与えるつもりはないと思うimport osか、import os.path好ましいです。
flornquake 2016年

1
@flornquakeのコメントのほとんどに同意しますが、最後の文には同意しません。posixpath.pyとntpath.pyはどちらも「osをインポートし、このモジュールをos.pathとして参照する」と言います。彼らは「os.pathをインポートし、このモジュールをos.pathとして参照する」とは言いません。macpath.pyは何の問題もありません。
ピートフォーマン2017年

3
これは、文書を含むかを示す良い例です。この D:ポインタは誤解を招くことができます
Cyker

7

興味深いことに、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使用する必要があるモジュールの唯一の部分であるコードの読者に伝える方を好む理由を理解できます。それは本質的に私の頭の中のスタイルの質問に要約されます。


2
from os import path速度に問題がある場合、pathの呼び出しがさらに速くなります。
ジャスティンピール

Pythonicであるため、明示的は暗黙的よりも優れていますか?実際には、ユーザーがos.pathだけを使用するのか、os内の複数のモジュールを使用するのかは、ユーザーによる判断の呼びかけだと思います。たぶん、一方の方法がもう一方の方法よりもあなたの哲学により合っているのでしょうか?
Andrew Kou

23
これのタイミングは、私が今までに見た時期尚早の時期尚早の最適化の一部です。これは決して誰のボトルネックにもならず、ここでの時間は誰かがどのようにコーディングすべきかには重要ではありません。
マイクグラハム

5

ここでosは常識が機能します。はモジュールでありos.path、モジュールでもあります。したがって、使用するモジュールをインポートするだけです。

  • osモジュールで機能を使用する場合は、をインポートしosます。

  • os.pathモジュールで機能を使用する場合は、をインポートしos.pathます。

  • 両方のモジュールで機能を使用する場合は、両方のモジュールをインポートします。

    import os
    import os.path

参考のため:


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.