import os
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模块,这样我就可以开始使用它。
import os
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模块,这样我就可以开始使用它。
当前回答
根据文档:
__file__是模块所在文件的路径名 加载,如果是从文件中加载的。__file__属性不是 用于静态链接到解释器的C模块; 对于从共享库动态加载的扩展模块,则是 共享库文件的路径名。
还有:
__file__将是文件的“路径”,除非模块是内置的(因此在sys.builtin_module_names中列出),在这种情况下,该属性没有设置。
其他回答
我想先解决一些困惑。__file__不是通配符,而是一个属性。双下划线属性和方法按照惯例被认为是“特殊的”,用于特殊目的。
http://docs.python.org/reference/datamodel.html显示了许多特殊方法和属性(如果不是全部的话)。
在这种情况下,__file__是一个模块的属性(模块对象)。在Python中,.py文件是一个模块。因此import module会有一个__file__属性,在不同的情况下有不同的含义。
摘自以下文件:
__file__是模块被加载的文件的路径名,如果它是从一个文件中加载的。__file__属性不存在 用于静态链接到解释器的C模块;为 扩展模块从共享库动态加载,它是 共享库文件的路径名。
在你的例子中,模块正在全局命名空间中访问自己的__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
在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等等),看看有什么不同。
只是在这里添加一个简短的注释(主要是回答问题的标题,而不是它的描述),关于一个可能让一些人困惑的变化。从Python 3.4开始,__file__的行为有了轻微的变化:
它被设置为使用它的模块的相对路径,如果该模块是直接执行的。 否则,它将被设置为文件的绝对路径。
模块__file__属性(和相关值)现在默认总是包含绝对路径,唯一的例外是__main__。当脚本直接使用相对路径执行时,__file__。(由Brett Cannon在第18416期贡献。)
例子:
直接调用模块x,间接调用模块y:
# x.py:
from pathlib import Path
import y
print(__file__)
print(Path(__file__))
print(Path(__file__).resolve())
# y.py:
from pathlib import Path
print(__file__)
print(Path(__file__))
运行python3 x.py将输出:
/home/aderchox/mytest/y.py
/home/aderchox/mytest/y.py
x.py
x.py
/home/aderchox/mytest/x.py
为了补充aderchox的答案,__file__变量的行为在Python 3.9中再次改变,现在它在所有情况下都是绝对路径
运行相同的示例(但为了自一致性将其复制到这里)
# x.py:
from pathlib import Path
import y
print(__file__)
print(Path(__file__))
print(Path(__file__).resolve())
# y.py:
from pathlib import Path
print(__file__)
print(Path(__file__))
现在用两个不同版本的解释器运行x.py
$ python3.8 x.py
/private/tmp/y.py
/private/tmp/y.py
x.py
x.py
/private/tmp/x.py
$ python3.9 x.py
/private/tmp/y.py
/private/tmp/y.py
/private/tmp/x.py
/private/tmp/x.py
/private/tmp/x.py
来源: https://docs.python.org/3/whatsnew/3.9.html#other-language-changes
根据文档:
__file__是模块所在文件的路径名 加载,如果是从文件中加载的。__file__属性不是 用于静态链接到解释器的C模块; 对于从共享库动态加载的扩展模块,则是 共享库文件的路径名。
还有:
__file__将是文件的“路径”,除非模块是内置的(因此在sys.builtin_module_names中列出),在这种情况下,该属性没有设置。