__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名。