2011-08-22 135 views
36

假設我有兩個Python模塊和PATH_B是在進口路徑:模塊從哪裏導入?

# file: path_b/my_module.py 
print "I was imported from ???" 

#file: path_a/app.py 
import my_module 

是否有可能看到的模塊從進口?如果我啓動app.py(因爲我需要文件名),我需要輸出如「我從path_a/app.py導入」。

編輯: 爲了更好的理解,我可以這樣寫:

# file: path_b/my_module.py 
def foo(file): 
    print "I was imported from %s" % file 

#file: path_a/app.py 
import my_module 
my_module.foo(__file__) 

所以輸出將是:

$> python path_app.py 
I was imported from path_a/app.py 

回答

12

有可能做到這一點更簡單的方法,但這個工程:

import inspect 

print inspect.getframeinfo(inspect.getouterframes(inspect.currentframe())[1][0])[0] 

注意,路徑相對於當前的工作目錄,如果它的腳本位置的父目錄進行打印。

+1

這就是我搜索的內容。謝謝。 – svenwltr

6

嘗試my_module.__file__找出它的出處。如果您收到AttributeError,則可能不是Python源文件(.py)。

34

試試這個:

>>> import my_module 
>>> my_module.__file__ 
'/Users/myUser/.virtualenvs/foobar/lib/python2.7/site-packages/my_module/__init__.pyc' 

編輯

在這種情況下,寫入到__init__.py文件的模塊:

print("%s: I was imported from %s" %(__name__, __file__)) 
+3

調用後'app.py'我想要'my_module'模塊中'app.py'的路徑。 – svenwltr

+1

這對'從模塊導入的東西'不起作用;那麼'thing .__ file__'將不會出現。 – tripleee

-3

其他答案是確定的,但如果你想從內部告知進口模塊然後做

print "I was imported from %s" % __file__ 
1

另外,如果你從一個模塊的函數/類fm您可以使用該模塊inspect

得到模塊的路徑
import inspect 
from m import f 

print inspect.getmodule(f) 
0

我已經寫了一個簡單的腳本,所以我有命令pywhich ,它允許我找到一個Python模塊來自哪裏。 它不適用於像sys這樣沒有\__file__屬性的內建程序。

這可以從Linux命令行運行尋找到在當前環境中運行一個python腳本會得到一個模塊,例如:

% pywhich os


#! /usr/bin/env python 

def pywhich(module_name): 

    module = __import__(module_name, globals(), locals(), [], -1) 

    return module.__file__ 


if __name__ == "__main__": 

    import sys 

    print(pywhich(sys.argv[1]))