2

現在実行中のスクリプトのファイル名とディレクトリを取得しようとしていますが、これが機能するコードです。

import inspect, os
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))

php では、これはecho dirname(__FILE__). 素敵でシンプル。

Python で動作するはずの提案がありますがdirname(__file__)、コマンド ライン経由で実行すると空の文字列が返されます。

私の質問は、なぜファイル名を取得するためにこのコードをすべて書かなければならないのかということです:

print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))

私はそれを間違っていますか?

4

3 に答える 3

4

現在のスクリプトの__file__値は、Python に渡したパスとまったく同じです。python yourscript.pyしたがって、相対パスであり、ディレクトリ名は含まれません。絶対パスにする必要がありますが、使用する必要はありませinspect:

import os.path

print os.path.dirname(os.path.abspath(__file__))

デモ:

$ cat /private/tmp/test.py 
import os.path

print os.path.dirname(os.path.abspath(__file__))

$ python /private/tmp/test.py 
/private/tmp
$ cd /private/tmp/
$ python test.py 
/private/tmp

PHP では、完全に指定された絶対パスを使用してファイルを実行する Web サーバーの余裕があるため、この「問題」が発生することはありません。

于 2013-06-22T10:37:10.367 に答える
1

私の質問は、なぜファイル名を取得するためにこのコードをすべて書かなければならないのかということです:

print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))

一つ一つ見ていきましょう。

まず、printは PHP の よりも 1 文字長いですecho。あなたに問題があるとは思えません。

次に、Python ではコードをモジュールに編成でき、修飾名で参照できるため、os.path.dirname代わりに使用する必要があります。これが、Python がとのような同じ名前のdirname関数を持つことができる理由です。ただし、使用したくない場合は、修飾名を使用する必要はありません。たとえば、 の代わりに を使用できます。gzip.openio.openfrom os.path import dirnameimport osdirname

abspath次に、相対パスがある可能性があるため、 が必要です。これは、実際には PHP とまったく同じです。スクリプトを常に絶対パスで実行する Web ブラウザーのセットアップから PHP を実行することに慣れているだけです。必要に応じて、Python でも同じことができます。

ついに:

Python で動作するはずの提案がありますがdirname(__file__)、コマンド ライン経由で実行すると空の文字列が返されます。

違います。

$ cat > test.py
print __file___
$ python test.py
test.py

「コマンドライン経由で実行する」が「対話型インタープリターを使用する」ことを意味する場合、もちろん、__file__ファイルがないため(端末の標準入力を除く)、ファイルはありません。

または、dirnameのような相対パスを出力する場合test.pyは、もちろん、PHP の場合と同様に、常に空の文字列になります。

すべてを一緒に入れて:

$ cat > test.py
from os.path import dirname
print dirname(__file__)
$ python $(abspath test.py)
/Users/abarnert/src/test

PHPのように。

于 2013-06-22T10:38:36.883 に答える
0

が設定されていない場合__file__は、次の方法でディレクトリを取得できます。

import sys, os
script = os.path.abspath(sys.argv[0] or 'unknown script')
directory = os.path.dirname(script))
于 2013-06-22T10:30:12.077 に答える