どのようにして求めるのですかパスとファイルのファイル名を現在実行中の?

StackOverflow https://stackoverflow.com/questions/50499

  •  09-06-2019
  •  | 
  •  

質問

私はスクリプトの呼び他のスクリプトファイルがいく必要があるfilepathファイルのファイルは現在実行中のプロセス。

例えば、ということかしてファイルです。を使用 execfile:

  • script_1.py 電話 script_2.py.
  • ひいて script_2.py 電話 script_3.py.

どうすればファイルの名前とパス script_3.py, からコード script_3.py, なくても、その情報を引数にとりから script_2.py?

(実行 os.getcwd() 返いものができるのだ、という点にスクリプトのfilepathない現在のファイルです。

役に立ちましたか?

解決

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

他のヒント

__file__

い(とは言った。また利用したい os.ます。realpath をsymlinks:

import os

os.path.realpath(__file__)

更新2018-11-28:

こちらではの概要と実験Python2-3と

main.py として活動させて頂いておりfoo.py
foo.py として活動させて頂いておりlib/bar.py
lib/bar.py -版画filepath表現

| Python | Run statement       | Filepath expression                    |
|--------+---------------------+----------------------------------------|
|      2 | execfile            | os.path.abspath(inspect.stack()[0][1]) |
|      2 | from lib import bar | __file__                               |
|      3 | exec                | (wasn't able to obtain it)             |
|      3 | import lib.bar      | __file__                               |

Python2ではこれをより明確に切り替えるパッケージで使用 from lib import bar -だけで追加空 __init__.py ファイルのフォルダの中に別のフォルダを作

Python3, execfile 存在しない-最寄りのインタビューを受けたことがあ exec(open(<filename>).read()), が、この影響を受けて、スタックフレームに。もっとも簡単なだけ利用 import fooimport lib.bar -no __init__.py ファイルが必要です。

参照 差輸入execfile


独自の回答:

ここでは実験に基づく回答がこのスレッド-Python2.7.10Windows上でしか利用できません。

のスタックに基づくものだけなのでう信頼できるにおいて最短の書式, (-

print os.path.abspath(inspect.stack()[0][1])                   # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1]))  # C:\filepaths\lib

こちらはこれらに加えたもの sys として機能!信用@うさぎや@pablog

に基づき、以下の三つのファイル、main.py からそのフォルダ python main.py またexecfilesに対して、絶対パスとして電話をかける別のフォルダ).

C:\filepaths\main.py: execfile('foo.py')
C:\filepaths\foo.py: execfile('lib/bar.py')
C:\filepaths\lib\bar.py:

import sys
import os
import inspect

print "Python " + sys.version
print

print __file__                                        # main.py
print sys.argv[0]                                     # main.py
print inspect.stack()[0][1]                           # lib/bar.py
print sys.path[0]                                     # C:\filepaths
print

print os.path.realpath(__file__)                      # C:\filepaths\main.py
print os.path.abspath(__file__)                       # C:\filepaths\main.py
print os.path.basename(__file__)                      # main.py
print os.path.basename(os.path.realpath(sys.argv[0])) # main.py
print

print sys.path[0]                                     # C:\filepaths
print os.path.abspath(os.path.split(sys.argv[0])[0])  # C:\filepaths
print os.path.dirname(os.path.abspath(__file__))      # C:\filepaths
print os.path.dirname(os.path.realpath(sys.argv[0]))  # C:\filepaths
print os.path.dirname(__file__)                       # (empty string)
print

print inspect.getfile(inspect.currentframe())         # lib/bar.py

print os.path.abspath(inspect.getfile(inspect.currentframe())) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:\filepaths\lib
print

print os.path.abspath(inspect.stack()[0][1])          # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1]))  # C:\filepaths\lib
print

こういうクリーナー:

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

しと同じ情報:

print inspect.getfile(inspect.currentframe())

が[0]は現在のフレームのスタックトップのスタック)、[1]のファイル名に増加への後方にはスタックする

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

のファイル名のスクリプトと呼び、現在のフレーム。また、[-1]まですぐ下部のスタックの呼び出します。

import os
os.path.dirname(__file__) # relative directory path
os.path.abspath(__file__) # absolute file path
os.path.basename(__file__) # the file name only

の提案としてマークベストはすべてtrueの場合にスクリプトからのファイルです。

したい場合は、名前の実行ファイル(すなわちのrootファイルに渡される、pythonインタプリタは、現在のプログラム)からのファイルとして輸入されたモジュールが必要なことだとこれはという名前のファイル foo.py):

import inspect

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

では最後のもふもふをご堪能ください([-1] のスタックの一番最初に目に入ったので書庫は評価/FILOデータ構造).

そしてファイル bar.py の場合 import foo だ印刷 bar.py, よ foo.py, する価値のすべてのことが、この

  • __file__
  • inspect.getfile(inspect.currentframe())
  • inspect.stack()[0][1]
import os
print os.path.basename(__file__)

このファイル名のみです。すなわちまabspathのファイルc:\abcd\abc.py そして2ライン印刷abc.py

でいないかどうかは分からないよ"のfilepathファイルのファイルは現在実行中のプロセス".sys.argv[0] 通常の位置にスクリプトが呼び出される、Pythonインタプリタチェックを sys書 できます。

として@Timと@Pat Notzて指摘され、__file__属性へのアクセスを提供

ファイルからのモジュールでした 読み込まれだからロードされたファイル

私はスクリプトに必要なwindows環境です。このコードsnippedはんどろ風mikiモデルを作ってみで仕上げた:

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

こhacky決定します。も必要としない外部ライブラリで最も重要なことは、私た。

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

な検査やその他の図書館があります。

こうした輸入スクリプトから別のディレクトリの実行スクリプト)を使用設定ファイル在住のと同じフォルダに輸入されます。

__file__ 属性の作品の両方のファイルを含む主な実行するコーポレートガバナンスと輸入モジュールです。

https://web.archive.org/web/20090918095828/http://pyref.infogami.com/__file__

import sys

print sys.path[0]

このように印刷し、現在実行中のスクリプト

と思うので __file__ うまいチェックアウトの 検査モジュール.

利用できる 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'

うこ

import os
os.path.dirname(os.path.realpath(__file__))
import sys
print sys.argv[0]

この仕事:

import os,sys
filename=os.path.basename(os.path.realpath(sys.argv[0]))
dirname=os.path.dirname(os.path.realpath(sys.argv[0]))

車ディレクトリの実行スクリプト

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

の移動の一貫性プラットフォーム(macintosh/Windows/Linux),試:

path = r'%s' % os.getcwd().replace('\\','/')

print(__file__)
print(__import__("pathlib").Path(__file__).parent)

を使用したアプローチ__file__
os.path.abspath(__file__)
もあり少しトリックを返します。pyファイル 時にコードが実行、 次の行には、名の*.pycファイル
いきもと:
inspect.getfile(inspect.currentframe())
または
sys._getframe().f_code.co_filename

って機能を考慮したeclipse デバッガunittest.を返しますフォルダの最初のスクリプトで起動します。できるオプションで指定 __file__ varが、主なものは、がんと共に、この変数は全てのお 呼び出しの階層.

ものを処理することができますその他のスタックは、特別の場合こちらでお分かりになったが、私にとってもokです。

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_))

も簡単な方法です:

script_1.py:

import subprocess
subprocess.call(['python3',<path_to_script_2.py>])

script_2.py:

sys.argv[0]

P.S.:たって execfile, が、そうでなくても、この読み込みscript_2.py として、文字列 sys.argv[0] 返される <string>.

いて使用されたばかりのosの機能の現在の作業ディレクトリ、またはCWD.この標準ライブラリが非常に容易に類するものをいいます。以下に例を示します。

    import os
    base_directory = os.getcwd()

これらの答えを書いたPythonのバージョン2.xはいません。Python3.xの書式の印刷機能を必要とし括弧内は、print().

この前のハイスコアかuser13993Python2.x:

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

なPython3.x:

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

したい場合は、ファイル名のな ./ または .py まこの

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

file_name まtestscript 形を生成することができますあなたを変えて指数内[]

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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top