2018年11月28日更新:
Python 2と3での実験の要約を以下に示します。
main.py-foo.pyを実行します
foo.py-lib / bar.pyを実行しますlib / bar.py-
ファイルパス式を出力します
| 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__ |
Python 2の場合、使用できるようにパッケージに切り替える方が明確かもしれません。2つのフォルダーにfrom lib import bar
空の__init__.py
ファイルを追加するだけです。
Python 3の場合、execfile
存在しません- exec(open(<filename>).read())
スタックフレームに影響しますが、最も近い代替はです。それはちょうど使用する最も簡単だimport foo
とimport lib.bar
何も- __init__.py
ファイルは必要ありません。
importとexecfileの違いもご覧ください。
元の回答:
これは、このスレッドでの回答に基づいた実験です-Windows上のPython 2.7.10。
スタックベースのものは、信頼できる結果を与えるように見える唯一のものです。最後の2つは最短の構文、つまり-
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に追加されます!@Usagiと@pablogへのクレジット
次の3つのファイルに基づいて、main.pyをそのフォルダーから実行しますpython main.py
(絶対パスを使用してexecfileを試し、別のフォルダーから呼び出します)。
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
__file__
属性絶対または相対?