2016-09-02 1 views
-1

私はSphinxでカスタムPythonコードを実行しており、は呼び出し元モジュールへのパスを取得する必要があります。私はHow to use inspect to get the caller's info from callee in Python?あたりとしてinspect.stack()からファイル名を取得することができますSphinx conf.pyで実行されるPython関数から呼び出し側モジュールのパスを取得する信頼できる方法はありますか?

が、どうやら私は、Pythonのコンテキストでこのファイル名を解釈する必要があります。(私はこの場所からの相対ファイル名を解釈する必要があります。基本的にこれは、呼び出し側の__file__オブジェクトです)起動ディレクトリ。 (時にはinspect.stack()[k][1]は絶対パスですが、時にはそれがconf.pyのような相対パスであり、inspect.stack()関数はPythonの起動ディレクトリに相対的であることをunutbu claims in a commentしかし、これを文書化していないようです。)

スフィンクスは、いくつかの意図せず悪のことを行いますこのコメントのように:

# This file is execfile()d with the current directory set to its 
# containing dir. 

のでos.path.abspath(filename)は動作しません、と

# If extensions (or modules to document with autodoc) are in another directory, 
# add these directories to sys.path here. If the directory is relative to the 
# documentation root, use os.path.abspath to make it absolute, like shown here. 
sys.path.insert(0, os.path.abspath('extensions')) 

のでsys.path[0]はcorrupです私のコードがそれに到達するまでに時間がかかりました。

sys.pathが変更されている場合、Pythonでスタートアップディレクトリを見つけるにはどうすればよいですか?

また、呼び出し元モジュールへのパスを取得する別の方法がありますか?


私はこの取得Jean-François Fabre's answer

for file,line,w1,w2 in traceback.extract_stack(): 
    sys.stdout.write(' File "{}", line {}, in {}\n'.format(file,line,w1)) 

を実行する場合:

File "c:\app\python\anaconda\1.6.0\Scripts\sphinx-build-script.py", line 5, in <module> 
File "c:\app\python\anaconda\1.6.0\lib\site-packages\Sphinx-1.4.1-py2.7.egg\sphinx\__init__.py", line 51, in main 
File "c:\app\python\anaconda\1.6.0\lib\site-packages\Sphinx-1.4.1-py2.7.egg\sphinx\__init__.py", line 92, in build_main 
File "c:\app\python\anaconda\1.6.0\lib\site-packages\Sphinx-1.4.1-py2.7.egg\sphinx\cmdline.py", line 243, in main 
File "c:\app\python\anaconda\1.6.0\lib\site-packages\Sphinx-1.4.1-py2.7.egg\sphinx\application.py", line 155, in __init__ 
File "conf.py", line 512, in setup 
[more lines elided, the conf.py is the one that matters] 

をので、問題は、私はconf.pyへのパスを見つける必要があるが、現在のディレクトリはによって変更されたということですスフィンクスだから私はできないよos.path.abspath(caller_filename)

+3

'os.getcwd()'のpythonは '__file__'は「私はあなたが何を意味を知らない...あなたはそれ以外の –

+0

をどんなの.pyファイルのパスとファイル名を教えてくれます実行されているディレクトリです起動ディレクトリ " –

+0

"ですが、私はこのファイル名をいくつかのディレクトリのコンテキストで解釈する必要があります。 "どういう意味ですか? –

答えて

0

フン、私は発信者が通過できるようにすることで問題を回避するつもりです

:-(その__file__価値の私の機能:conf.pyで

def do_something(app, filename, relroot=None): 
    if relroot is None: 
     relroot = '.' 
    else: 
     relroot = os.path.dirname(relroot) 
    path = os.path.join(relroot, filename) 
    ... 

def setup(app): 
    mymodule.do_something(app, 'path/to/file', relroot=__file__) 
+0

私はちょうど有効な答えをdownvote石投手を愛する。 –

3

n tracebackモジュールを使用して、必要なものを入手します。私はPyScripterでこのサンプルコードを書いている:

import traceback,sys 

def demo(): 
    for file,line,w1,w2 in traceback.extract_stack(): 
     sys.stdout.write(' File "{}", line {}, in {}\n'.format(file,line,w1)) 

def foo(): 
    demo() 

foo() 

私のWindows PCで実行PyScripterに与える:

File "C:\Users\dartypc\AppData\Roaming\PyScripter\remserver.py", line 63, in <module> 
    File "C:\Users\dartypc\AppData\Roaming\PyScripter\remserver.py", line 60, in main 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\utils\server.py", line 227, in start 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\utils\server.py", line 139, in accept 
    File "C:\Users\dartypc\AppData\Roaming\PyScripter\remserver.py", line 14, in _accept_method 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\utils\server.py", line 191, in _serve_client 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 391, in serve_all 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 382, in serve 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 350, in _dispatch 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 298, in _dispatch_request 
    File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 528, in _handle_call 
    File "<string>", line 420, in run_nodebug 
    File "C:\DATA\jff\data\python\stackoverflow\simple_traceback.py", line 10, in <module> 
    File "C:\DATA\jff\data\python\stackoverflow\simple_traceback.py", line 8, in foo 
    File "C:\DATA\jff\data\python\stackoverflow\simple_traceback.py", line 4, in demo 
+0

それはうまくいかないようです。私はまだ相対的なファイル(私は私の答えでコメントします) –

+0

気がついた:タフな幸運に立ち往生! 'PYTHONPATH'環境変数を解釈しようとしますか?少なくともそれは 'sys.path'のように流血ではありません。 –

+0

いいえ、私は問題はSphinxが 'execfile()'を実行し、これがイントロスペクションを駄目にすることだと思います。 –

関連する問題