【问题标题】:os.path.dirname(__file__) returns emptyos.path.dirname(__file__) 返回空
【发布时间】:2011-10-16 09:03:07
【问题描述】:

我想获取当前执行.py文件所在目录的路径。

例如一个带有代码的简单文件D:\test.py

import os

print os.getcwd()
print os.path.basename(__file__)
print os.path.abspath(__file__)
print os.path.dirname(__file__)

奇怪的是输出是:

D:\
test.py
D:\test.py
EMPTY

我期待getcwd()path.dirname() 的结果相同。

鉴于os.path.abspath = os.path.dirname + os.path.basename,为什么

os.path.dirname(__file__)

返回空?

【问题讨论】:

    标签: python


    【解决方案1】:

    因为os.path.abspath = os.path.dirname + os.path.basename 不成立。我们宁愿有

    os.path.dirname(filename) + os.path.basename(filename) == filename
    

    dirname()basename() 都只将传递的文件名拆分为组件,而不考虑当前目录。如果您还想考虑当前目录,则必须明确这样做。

    要获取绝对路径的目录名,请使用

    os.path.dirname(os.path.abspath(__file__))
    

    【讨论】:

    • 嗨 Sven,你是对的,应该是 os.path.dirname(os.path.abspath(file))。谢谢!仅供参考,最后一行有一个小错字。
    • 请注意,上面的注释有一个粗体,由于降价格式,两边应该有下划线。原答案已正确更改
    • 请注意,我们从来没有os.path.dirname(filename) + os.path.basename(filename) == filename,因为缺少目录分隔符。我们宁愿有:os.path.join(os.path.dirname(filename), os.path.basename(filename)) == filename
    • 我很困惑,你应该在你的程序中留下 basedir = os.path.abspath(os.path.dirname(file)) 吗?或者你要替换什么或在哪里替换你的路径,如 C:\Users\Test\app.db?
    • @pes04 __file__ 扩展为当前文件的名称,因此您可以使用此答案中代码的逐字副本。
    【解决方案2】:

    也可以这样使用:

    dirname(dirname(abspath(__file__)))
    

    【讨论】:

      【解决方案3】:
      os.path.split(os.path.realpath(__file__))[0]
      

      os.path.realpath(__file__)return 当前脚本的绝对路径; os.path.split(abspath)[0] 返回当前目录

      【讨论】:

        【解决方案4】:
        import os.path
        
        dirname = os.path.dirname(__file__) or '.'
        

        【讨论】:

          【解决方案5】:
          print(os.path.join(os.path.dirname(__file__))) 
          

          你也可以这样用

          【讨论】:

            【解决方案6】:

            从Python 3.4开始,可以使用pathlib获取当前目录:

            from pathlib import Path
            
            # get parent directory
            curr_dir = Path(__file__).parent
            
            file_path = curr_dir.joinpath('otherfile.txt')
            

            【讨论】:

              【解决方案7】:

              我猜这是没有 os 模块的直接代码..

              __file__.split(__file__.split("/")[-1])[0]
              

              【讨论】:

                猜你喜欢
                • 2012-06-12
                • 2016-11-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-01-27
                相关资源
                最近更新 更多