2016-04-18 6 views
1

を実行すると、ファイル名がfoo.pyになることがありますが、それ以外の場合はfoo.pycとなります。私はpycがコンパイルされたファイルであることを理解しています。コンパイルされたファイルは、おそらくコンパイル後に毎回使用されます。私はちょうどbasenameがpycファイル名を返す理由について混乱していますか?それは普通ですか?次に、コンパイルされていないファイル名を返すか、拡張子を付けずに返すようにするにはどうすればよいですか?なぜbasenameはコンパイルされたファイル名を返しますか?

+0

これはインポートされたモジュールで呼び出されていますか? –

+0

'os.path.splitext(os.path.basename(__ file __))[0] + os.path.extsep +" py "' – zondo

+0

おそらく '__file__'の初期値を変更することはできませんが、 'os.path.splitext()'を使ってファイル名から拡張します。 – martineau

答えて

3

を使用してください。__file__は、*モジュールで実際にロードされたファイルを反映しています。モジュールをインポートするとき、Pythonは最初に.pycファイルを見つけようとします。見つかった場合は使用されたファイル名になります。そうでなければ.pyファイルになります。

それは Pythonはそれができるならば、キャッシュファイルを作成しようとしますと、あなたは、それが代わりに.pycファイルを読み込ま見つけるインタプリタの実行時に.pyから__file__かのポイントということかもしれません。また、でない可能性があります。.pyソースファイルです。一部のプロジェクトは.pycファイル形式でのみ配布されます。最後に、Pythonはトップレベルのスクリプト用に.pycファイルを作成しません。

.pyソースファイルfilenameをフェールセーフで生成するには、末尾からcを削除するだけです。あなたはdがあまりにも(最適化されたバイトコードは、現在唯一のストリッピングがアサート).pydファイルを処理するために含めることができます

sourcefile = __file__.rstrip('cd') 

は、ファイルが実際に存在するかどうかを確認ください! *


キャッシュされたバイトコード・ファイルが格納されている場所のPython 3が変更され、.pycファイルが存在する場合でも、一方が存在する場合__file__は、ソース・ファイル・パスを使用します。

+0

'splitext'より' rstrip'を好むのはなぜですか? – Tjorriemorrie

+0

@Tjorriemorrie:シンプル。これは、ロード可能なすべてのモジュール拡張( '.dll'、' .so'、 '.pyc'、' .pyd'、 '.py') –

1

__file__は、あなたがそれについて何かをする前に定義されています。あなたの代わりに.pyファイルを取得したい場合、あなたはそれがあなた自身であるかを把握する必要があります:

without_ext = os.path.splitext(os.path.basename(__file__))[0] 
with_new_ext = os.path.extsep.join(without_ext, "py") 

時には、.pyファイルが存在すらしていません。あなたがコードを書いたので、あなたはそれを削除したことはありませんが、その可能性があります。存在することを確認するには、os.path.isfile()

関連する問題