模块从哪里导入?

sve*_*ltr 61 python

假设我有两个Python模块,并且path_b在导入路径中:

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

#file: path_a/app.py
import my_module
Run Code Online (Sandbox Code Playgroud)

是否可以查看模块的导入位置?我想要一个输出,如"我是从path_a/app.py导入的",如果我启动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__)
Run Code Online (Sandbox Code Playgroud)

所以输出将是:

$> python path_app.py
I was imported from path_a/app.py
Run Code Online (Sandbox Code Playgroud)

Joh*_*nes 81

试试这个:

>>> import my_module
>>> my_module.__file__
'/Users/myUser/.virtualenvs/foobar/lib/python2.7/site-packages/my_module/__init__.pyc'
Run Code Online (Sandbox Code Playgroud)

编辑

在这种情况下写入__init__.py您的模块的文件:

print("%s: I was imported from %s" %(__name__, __file__))
Run Code Online (Sandbox Code Playgroud)

  • 在调用'app.py'之后,我希望'my_module'模块中的'app.py'路径. (4认同)
  • 这不适用于“从模块导入事物”;那么 `thing.__file__` 将不会出现。 (2认同)

Woo*_*ble 15

可能有一种更简单的方法可以做到这一点,但这有效:

import inspect

print inspect.getframeinfo(inspect.getouterframes(inspect.currentframe())[1][0])[0]
Run Code Online (Sandbox Code Playgroud)

请注意,如果路径是脚本位置的父目录,则将相对于当前工作目录打印路径.


Noc*_*wer 12

试着my_module.__file__找出它的来源.如果你得到了AttributeError,它可能不是Python源(.py)文件.


Fáb*_*niz 10

此外,如果您有f模块中的函数/类,则m可以使用模块获取模块的路径inspect

import inspect
from m import f

print inspect.getmodule(f)
Run Code Online (Sandbox Code Playgroud)

  • 这比接受的答案有用得多! (2认同)

小智 8

这就是我的做法:

print(module_name.__path__)
Run Code Online (Sandbox Code Playgroud)


Ada*_*son 7

我写了一个简单的脚本,所以我有一个命令pywhich 可以让我找到 Python 模块的来源。它不适用于像 sys 这样没有\__file__属性的内置函数。

这可以从 Linux 命令行运行,以查找在当前环境中运行的 python 脚本将从哪里获取模块,例如:

% 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]))
Run Code Online (Sandbox Code Playgroud)

  • 根据Python在线手册:版本3.3中的更改:不再支持level的负值(这也将默认值更改为0)。因此,在对 \_\_import\_\_ 的调用中将 -1 更改为 0 (2认同)