Reputation: 18480
Assuming I have two Python modules and path_b is in the import path:
# file: path_b/my_module.py
print "I was imported from ???"
#file: path_a/app.py
import my_module
Is it possible to see where the module is imported from? I want an output like "I was imported from path_a/app.py", if I start app.py (because I need the file name).
Edit: For better understanding; I could write:
# 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__)
So the output would be:
$> python path_app.py
I was imported from path_a/app.py
Upvotes: 89
Views: 56057
Reputation: 90037
There may be an easier way to do this, but this works:
import inspect
print(inspect.getframeinfo(inspect.getouterframes(inspect.currentframe())[1][0])[0])
Note that the path will be printed relative to the current working directory if it's a parent directory of the script location.
Upvotes: 18
Reputation: 1223
You don't need any additional packages. For python3
:
python3 -m pip show <focal_package>
Upvotes: 1
Reputation: 86
If you want to know where file x.py
is being imported from - you could add raise RuntimeError()
to the first line of x.py
and inspect the stacktrace...
Upvotes: 1
Reputation: 101
I've written a simple script so I have the command pywhich
that allows me to find where a Python module comes from.
It doesn't work for some builtins like sys which doesn't have a \__file__
attribute.
This can be run from a Linux command line to find where a python script run in the current environment will get a module from, for example:
% pywhich os
#! /usr/bin/env python
def pywhich(module_name):
module = __import__(module_name, globals(), locals(), [], 0)
return module.__file__
if __name__ == "__main__":
import sys
print(pywhich(sys.argv[1]))
Upvotes: 10
Reputation: 2827
If you want to see where a module is stored, for example setuptools
, type in shell:
$ python -c "import setuptools; print(setuptools.__file__)"
Upvotes: 3
Reputation: 1608
Try this:
>>> import my_module
>>> my_module.__file__
'/Users/myUser/.virtualenvs/foobar/lib/python2.7/site-packages/my_module/__init__.pyc'
Edit
In that case write into the __init__.py
file of your module:
print("%s: I was imported from %s" %(__name__, __file__))
Upvotes: 118
Reputation: 10363
Also, if you have a function/class f
from a module m
you can get the path of the module using the module inspect
import inspect
from m import f
print inspect.getmodule(f)
Upvotes: 14
Reputation: 6955
Other answers are OK, but if you want to tell it from inside the imported module then do
print "I was imported from %s" % __file__
Upvotes: -5
Reputation: 22041
Try my_module.__file__
to find out where it is from. If you get an AttributeError
, it is probably not a Python source (.py) file.
Upvotes: 15