协慌网

登录 贡献 社区

如何获取模块的路径?

我想检测模块是否已更改。现在,使用 inotify 很简单,您只需要知道要从中获取通知的目录即可。

如何在 python 中检索模块的路径?

答案

import a_module
print(a_module.__file__)

实际上,至少在 Mac OS X 上,将为您提供已加载的. pyc 文件的路径。因此,我想您可以这样做:

import os
path = os.path.abspath(a_module.__file__)

您也可以尝试:

path = os.path.dirname(a_module.__file__)

获取模块的目录。

python 中有inspect模块。

官方文件

检查模块提供了几个有用的功能,以帮助获取有关活动对象的信息,例如模块,类,方法,函数,回溯,框架对象和代码对象。例如,它可以帮助您检查类的内容,检索方法的源代码,提取函数的参数列表并设置其格式或获取显示详细回溯所需的所有信息。

例:

>>> import os
>>> import inspect
>>> inspect.getfile(os)
'/usr/lib64/python2.7/os.pyc'
>>> inspect.getfile(inspect)
'/usr/lib64/python2.7/inspect.pyc'
>>> os.path.dirname(inspect.getfile(inspect))
'/usr/lib64/python2.7'

就像其他答案所说的那样,最好的方法是使用__file__ (在下面再次演示)。但是,有一个重要的警告,那就是如果您单独运行模块(即__main__ ),则__file__不存在。

例如,假设您有两个文件(两个文件都在 PYTHONPATH 上):

#/path1/foo.py
import bar
print(bar.__file__)

#/path2/bar.py
import os
print(os.getcwd())
print(__file__)

运行 foo.py 将给出输出:

/path1        # "import bar" causes the line "print(os.getcwd())" to run
/path2/bar.py # then "print(__file__)" runs
/path2/bar.py # then the import statement finishes and "print(bar.__file__)" runs

但是,如果尝试单独运行 bar.py,则会得到:

/path2                              # "print(os.getcwd())" still works fine
Traceback (most recent call last):  # but __file__ doesn't exist if bar.py is running as main
  File "/path2/bar.py", line 3, in <module>
    print(__file__)
NameError: name '__file__' is not defined

希望这可以帮助。在测试其他解决方案时,此警告使我花费了大量时间和困惑。