模块从哪里导入?

模块从哪里导入?

问题描述:

假设我有两个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 

有可能做到这一点更简单的方法,但这个工程:

import inspect 

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

注意,路径相对于当前的工作目录,如果它的脚本位置的父目录进行打印。

+1

这就是我搜索的内容。谢谢。 – svenwltr

尝试my_module.__file__找出它的出处。如果您收到AttributeError,则可能不是Python源文件(.py)。

试试这个:

>>> 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

其他答案是确定的,但如果你想从内部告知进口模块然后做

print "I was imported from %s" % __file__ 

另外,如果你从一个模块的函数/类fm您可以使用该模块inspect

得到模块的路径
import inspect 
from m import f 

print inspect.getmodule(f) 

我已经写了一个简单的脚本,所以我有命令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]))