どのようにして求めるのですかパスとファイルのファイル名を現在実行中の?
質問
私はスクリプトの呼び他のスクリプトファイルがいく必要がある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
他のヒント
更新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 foo
や import 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)