2015-02-10 33 views
0

我正在寫一個通用打印類:查找以前的功能的堆棧蟒蛇的路徑

from __future__ import division 
import os.path 

class pprint: 
    def __init__(self, name, path=None): 
     self.name = name 
     if path == None: 
      #Where we define the path 
      ??? 
     self.path = path 
     self.complete_name = os.path.join(path, name) 
     self.f = open(complete_name, "w") 

    def __call__(text): 
     self.f.write(text + "\n") 
     print text 

構造函數的文件名稱寫入和包含該文件的路徑可選參數。如果用戶沒有指定路徑,我希望它寫入調用程序的目錄。我不知道怎麼做的唯一的事情是後者有條件的:如果沒有指定路徑,則假定路徑是調用函數的路徑。
我該如何發現?本質上,我想看看python函數堆棧,找出哪個函數調用pprint,找到該文件的路徑,然後將path設置爲該文件的路徑。然而,我不知道python函數堆棧是如何工作的。我該怎麼做呢?
謝謝!

編輯:我不想要__main__文件的路徑。如果我有a.py致電b.pyb.py致電pprint.py,我不想要a.py的路徑。 a.pyb.py的路徑可能完全不同。

編輯2:我正在使用Python 2.7.6。我在Ubuntu 14.04上,如果這是相關的。我使用內置的東西,附加一些其他的東西,如numpy,scipy,pylab等。我沒有IDE。我使用vim和Terminal。編輯編輯:哎呀!正如一篇博文所評論的,Ubuntu內置了Python IS CPython。我的錯。所以,我使用的CPython ...

+0

看過這個問題,看起來你真的只想得到主要的文件路徑。因此,我投票關閉了[如何獲取Python中的\ _ \ _main \ _ \ _模塊的文件名?](http://stackoverflow.com/questions/606561/how-to-獲得文件名,最主模塊中,蟒蛇的)。請澄清你的問題,如果這不是你想要的。 – jpmc26 2015-02-10 00:19:18

+0

我相信你需要'inspect.stack' – mgilson 2015-02-10 00:23:49

+0

@ jpmc26不是。如果我有a.py調用b.py和b.py調用pprint.py,我想要的路徑是b.py,而不是a.py.他們可能完全不同。 – QuantumFool 2015-02-10 00:25:01

回答

1

您可以使用inspect.getouterframes獲得致電者的框架,再加上文件名和行號等

from __future__ import division 

import inspect 
import os.path 

class pprint(object): 
    def __init__(self, name, path=None): 
     self.name = name 
     if path == None: 
      path = inspect.getouterframes(inspect.currentframe())[1][3] 

     self.path = path 
     self.complete_name = os.path.join(path, name) 
     self.f = open(complete_name, "w") 
     ... 

我假設你正在使用的Python 2.7的CPython或Jython

+0

我使用的是Python 2.7,但不是CPython – QuantumFool 2015-02-10 00:25:35

+0

所以,你應該說你正在使用哪個解釋器。 – ozgur 2015-02-10 00:32:09

+0

哎呀!正如我的主要評論所指出的,我實際上正在使用CPython。對此感到抱歉。 – QuantumFool 2015-02-10 00:41:23