515

他のスクリプト ファイルを呼び出すスクリプトがありますが、現在プロセス内で実行されているファイルのファイル パスを取得する必要があります。

たとえば、3 つのファイルがあるとします。execfile の使用:

  • script_1.pyを呼び出しますscript_2.py
  • 次に、 をscript_2.py呼び出しますscript_3.py

から引数として情報を渡すことなく、内のコードからscript_3.pyのファイル名とパスを取得するにはどうすればよいですか?script_3.pyscript_2.py

(実行os.getcwd()すると、現在のファイルではなく、元の開始スクリプトのファイルパスが返されます。)

4

30 に答える 30

591
__file__

他の人が言ったように。os.path.realpathを使用してシンボリック リンクを削除することもできます。

import os

os.path.realpath(__file__)
于 2009-12-23T20:33:47.133 に答える
273

p1.py:

execfile("p2.py")

p2.py:

import inspect, os
print (inspect.getfile(inspect.currentframe())) # script filename (usually with path)
print (os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))) # script directory
于 2008-09-08T23:02:42.043 に答える
74

私はこれがよりきれいだと思います:

import inspect
print inspect.stack()[0][1]

以下と同じ情報を取得します。

print inspect.getfile(inspect.currentframe())

[0] はスタック内の現在のフレーム (スタックの一番上) で、[1] はファイル名です。スタック内を後方に移動するには増加します。

print inspect.stack()[1][1]

現在のフレームを呼び出したスクリプトのファイル名になります。また、[-1] を使用すると、元の呼び出しスクリプトであるスタックの一番下に到達します。

于 2011-07-08T17:50:28.897 に答える
48
import os
os.path.dirname(__file__) # relative directory path
os.path.abspath(__file__) # absolute file path
os.path.basename(__file__) # the file name only
于 2015-02-06T01:05:18.657 に答える
37

スクリプトが 1 つのファイルのみで構成されている場合、最適とマークされた提案はすべて当てはまります。

モジュールとしてインポートされる可能性のあるファイルから実行可能ファイルの名前 (つまり、現在のプログラムの Python インタープリターに渡されるルート ファイル) を見つけたい場合は、これを行う必要があります (これがファイルにあると仮定しましょう)。foo.pyという名前):

import inspect

print inspect.stack()[-1][1]

スタックの最後のもの ( [-1]) が最初にスタックに入るためです (スタックは LIFO/FILO データ構造です)。

次に、ファイルbar.pyで、 foo.pyではなくimport foobar.pyを出力する場合、これらすべての値になります。

  • __file__
  • inspect.getfile(inspect.currentframe())
  • inspect.stack()[0][1]
于 2010-02-26T22:25:29.397 に答える
15

「現在プロセス内で実行されているファイルのファイルパス」の意味が完全には明確ではありません。 sys.argv[0]通常、Python インタープリターによって呼び出されたスクリプトの場所が含まれています。詳細については、 sys のドキュメントを確認してください。

@Tim と @Pat Notz が指摘したように、 __file__ 属性はへのアクセスを提供します

ファイルからロードされた場合、モジュールがロードされたファイル

于 2008-09-08T19:42:56.920 に答える
14
import os
print os.path.basename(__file__)

これにより、ファイル名のみが得られます。つまり、ファイルの abspath が c:\abcd\abc.py の場合、2 行目に abc.py が出力されます。

于 2013-08-11T03:05:05.107 に答える
12

Windows環境で動作する必要があるスクリプトがあります。切り取られたこのコードは、私が完成したものです:

import os,sys
PROJECT_PATH = os.path.abspath(os.path.split(sys.argv[0])[0])

それはかなりハッキーな決定です。しかし、外部ライブラリは必要なく、私の場合はこれが最も重要です。

于 2012-08-08T09:42:27.620 に答える
8
import os
os.path.dirname(os.path.abspath(__file__))

inspect やその他のライブラリは必要ありません。

これは、インポートされたスクリプトと同じフォルダーにある構成ファイルを使用するスクリプトを (実行されたスクリプトとは別のディレクトリから) インポートする必要があるときに機能しました。

于 2014-06-24T15:04:34.567 に答える
8

この__file__属性は、メインの実行コードを含むファイルとインポートされたモジュールの両方で機能します。

https://web.archive.org/web/20090918095828/http://pyref.infogami.com/__file__を参照してください

于 2008-09-08T19:56:19.730 に答える
7
import sys

print sys.path[0]

これにより、現在実行中のスクリプトのパスが出力されます

于 2010-01-02T18:34:55.573 に答える
5

あなたも検査モジュール__file__ をチェックアウトしたいかもしれないように聞こえるだけだと思います。

于 2008-09-08T19:44:07.433 に答える
4

使用できますinspect.stack()

import inspect,os
inspect.stack()[0]  => (<frame object at 0x00AC2AC0>, 'g:\\Python\\Test\\_GetCurrentProgram.py', 15, '<module>', ['print inspect.stack()[0]\n'], 0)
os.path.abspath (inspect.stack()[0][1]) => 'g:\\Python\\Test\\_GetCurrentProgram.py'
于 2008-09-09T00:00:52.887 に答える
3
import sys
print sys.argv[0]
于 2010-04-19T07:47:21.700 に答える
2

これはうまくいくはずです:

import os,sys
filename=os.path.basename(os.path.realpath(sys.argv[0]))
dirname=os.path.dirname(os.path.realpath(sys.argv[0]))
于 2015-06-14T16:37:44.943 に答える
2
print(__file__)
print(__import__("pathlib").Path(__file__).parent)
于 2019-05-05T01:19:50.733 に答える
0

私は常に現在の作業ディレクトリ (CWD) の os 機能を使用してきました。これは標準ライブラリの一部であり、実装は非常に簡単です。次に例を示します。

    import os
    base_directory = os.getcwd()
于 2019-01-23T16:31:44.130 に答える
0

eclipse debuggerunittestを考慮した関数を書きました。最初に起動したスクリプトのフォルダーを返します。オプションで__file__変数を指定できますが、主なことは、この変数をすべての呼び出し階層で共有する必要がないことです。

たぶん、私が見ていない他のスタックの特定のケースを処理できるかもしれませんが、私にとっては問題ありません。

import inspect, os
def getRootDirectory(_file_=None):
    """
    Get the directory of the root execution file
    Can help: http://stackoverflow.com/questions/50499/how-do-i-get-the-path-and-name-of-the-file-that-is-currently-executing
    For eclipse user with unittest or debugger, the function search for the correct folder in the stack
    You can pass __file__ (with 4 underscores) if you want the caller directory
    """
    # If we don't have the __file__ :
    if _file_ is None:
        # We get the last :
        rootFile = inspect.stack()[-1][1]
        folder = os.path.abspath(rootFile)
        # If we use unittest :
        if ("/pysrc" in folder) & ("org.python.pydev" in folder):
            previous = None
            # We search from left to right the case.py :
            for el in inspect.stack():
                currentFile = os.path.abspath(el[1])
                if ("unittest/case.py" in currentFile) | ("org.python.pydev" in currentFile):
                    break
                previous = currentFile
            folder = previous
        # We return the folder :
        return os.path.dirname(folder)
    else:
        # We return the folder according to specified __file__ :
        return os.path.dirname(os.path.realpath(_file_))
于 2016-06-14T15:06:50.273 に答える
0

私は __file__ でアプローチを使用しました
os.path.abspath(__file__)
が、ちょっとしたトリックがあります。コードが初めて実行されたときに .py ファイルを返し、次の実行では *.pyc ファイルの名前が付けられる
ので、そのまま:
inspect.getfile(inspect.currentframe())
または
sys._getframe().f_code.co_filename

于 2011-03-01T09:23:09.230 に答える
-3

ファイル名だけが必要な場合、./または.pyこれを試すことができます

filename = testscript.py
file_name = __file__[2:-3]

file_name[]内のインデックスを変更することで、必要なものを生成できるテストスクリプトを出力します

于 2013-01-20T20:52:13.340 に答える
-3
import os

import wx


# return the full path of this file
print(os.getcwd())

icon = wx.Icon(os.getcwd() + '/img/image.png', wx.BITMAP_TYPE_PNG, 16, 16)

# put the icon on the frame
self.SetIcon(icon)
于 2013-01-24T02:43:09.633 に答える