__file__variables意味着什么?

A = os.path.join(os.path.dirname(__file__), '..') B = os.path.dirname(os.path.realpath(__file__)) C = os.path.abspath(os.path.dirname(__file__)) 

我通常只是用实际path来硬连线。 但是这些语句在运行时确定path是有原因的,我真的很想理解os.path模块,所以我可以开始使用它。

在Python中加载模块时, __file__被设置为其名称。 然后可以使用其他函数来查找文件所在的目录。

一次一个例子:

 A = os.path.join(os.path.dirname(__file__), '..') # A is the parent directory of the directory where program resides. B = os.path.dirname(os.path.realpath(__file__)) # B is the canonicalised (?) directory where the program resides. C = os.path.abspath(os.path.dirname(__file__)) # C is the absolute path of the directory where the program resides. 

您可以在这里看到从这些返回的各种值:

 import os print __file__ print os.path.join(os.path.dirname(__file__), '..') print os.path.dirname(os.path.realpath(__file__)) print os.path.abspath(os.path.dirname(__file__)) 

并确保你从不同的位置(如./text.py ~/python/text.py等等)运行它,看看有什么不同。

我只想先解决一些困惑。 __file__不是通配符,它​​是一个属性。 双下划线的属性和方法被认为是“特殊的”按照惯例和服务的特殊目的。

http://docs.python.org/reference/datamodel.html显示了许多特殊的方法和属性,如果不是全部的话。;

在这种情况下, __file__是模块(模块对象)的一个属性。 在Python中.py文件是一个模块。 所以import amodule会有__file__的属性,这意味着在不同的情况下不同的东西。

从文档采取:

__file__是从模块加载的文件的path名,如果它是从文件加载的。 对于静态链接到解释器的C模块, __file__属性不存在; 对于从共享库dynamic加载的扩展模块,它是共享库文件的path名。

在你的情况下,模块正在全局命名空间中访问它自己的__file__属性。

要看到这个在行动中尝试:

 # file: test.py print globals() print __file__ 

并运行:

 python test.py {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__': 'test_print__file__.py', '__doc__': None, '__package__': None} test_print__file__.py 

使用__file__与各种os.path模块结合,可以使所有path与当前模块的目录位置相关。 这使您的模块/项目可以移植到其他机器上。

在你的项目中你可以:

 A = '/Users/myname/Projects/mydevproject/somefile.txt' 

然后尝试使用/home/web/mydevproject/等部署目录将其部署到您的服务器,那么代码将无法正确findpath。

根据文档 :

__file__是从模块加载的文件的path名,如果它是从文件加载的。 对于静态链接到解释器的C模块, __file__属性不存在; 对于从共享库dynamic加载的扩展模块,它是共享库文件的path名。