我想检测模块是否发生了变化。现在,使用inotify很简单,你只需要知道你想从哪个目录获取通知。

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


当前回答

import a_module
print(a_module.__file__)

会给你已经加载的。pyc文件的路径,至少在Mac OS x上是这样的

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

你也可以试试:

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

获取模块的目录。

其他回答

这是微不足道的。

每个模块都有一个__file__变量,它显示了你现在所在位置的相对路径。

因此,为模块获取一个目录来通知它很简单,如下所示:

os.path.dirname(__file__)

您可以导入您的模块 然后点击它的名字,你会得到它的完整路径

>>> import os
>>> os
<module 'os' from 'C:\\Users\\Hassan Ashraf\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\os.py'>
>>>
import a_module
print(a_module.__file__)

会给你已经加载的。pyc文件的路径,至少在Mac OS x上是这样的

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

你也可以试试:

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

获取模块的目录。

因此,我花了相当多的时间尝试用py2exe来实现这一点 问题是获取脚本的基本文件夹,无论它是作为python脚本还是作为py2exe可执行文件运行。此外,无论它是从当前文件夹、另一个文件夹还是(这是最难的)系统路径运行,它都能正常工作。

最终我使用了这种方法,使用sys.frozen作为py2exe中运行的指示符:

import os,sys
if hasattr(sys,'frozen'): # only when running in py2exe this exists
    base = sys.prefix
else: # otherwise this is a regular python script
    base = os.path.dirname(os.path.realpath(__file__))

我想提供一个常见的场景(在Python 3中),并探索一些实现它的方法。

内置函数open()接受相对路径或绝对路径作为其第一个参数。相对路径被视为相对于当前工作目录,因此建议将绝对路径传递给文件。

简单地说,如果你用下面的代码运行一个脚本文件,并不保证example.txt文件会被创建在脚本文件所在的同一目录下:

with open('example.txt', 'w'):
    pass

要修复这段代码,我们需要获取脚本的路径,并使其成为绝对路径。为了确保路径是绝对的,我们只需使用os.path.realpath()函数。为了获得脚本的路径,有几个常见的函数返回不同的路径结果:

os.getcwd() os.path.realpath('example.txt') sys.argv[0] __文件__

os.getcwd()和os.path.realpath()函数都会返回基于当前工作目录的路径结果。通常不是我们想要的。系统的第一个元素。Argv list是根脚本(您运行的脚本)的路径,而不管您是在根脚本本身中还是在其任何模块中调用该列表。在某些情况下可能会派上用场。__file__变量包含调用它的模块的路径。


下面的代码正确地在脚本所在的目录中创建了一个文件example.txt:

filedir = os.path.dirname(os.path.realpath(__file__))
filepath = os.path.join(filedir, 'example.txt')

with open(filepath, 'w'):
    pass