为什么basename返回编译后的文件名



运行os.path.basename(__file__)有时会将文件名作为foo.py,但有时会将其作为foo.pyc。我知道pyc是经过编译的文件,可能每次编译后都会使用它。我只是很困惑为什么basename会返回pyc文件名?这正常吗?其次,如何使它始终返回未编译的文件名或不返回扩展名?

在Python 2中,__file__反映了为模块*实际加载的文件。导入模块时,Python将尝试首先查找.pyc文件,如果找到,则为所使用的文件名,否则为.py文件。

可能是,如果__file__在解释器的下一次运行中指向.py,您会发现它加载了一个.pyc文件,因为Python会尽可能创建一个缓存文件。还要注意,可能存在而不是.py源文件;一些项目仅以CCD_ 12文件的形式分发。最后但同样重要的是,Python从未为顶级脚本创建.pyc文件。

生成.py源文件名的一种故障安全方法是简单地从末尾剥离c;您还可以包含一个d来处理.pyd文件(经过优化的字节码,目前仅剥离断言):

sourcefile = __file__.rstrip('cd')

请检查文件是否真的存在!


*Python 3更改了缓存的字节码文件的存储位置,即使存在.pyc文件,如果存在源文件路径,__file__也将使用源文件路径。

__file__是在你有机会对它做任何事情之前定义的。如果你想获得.py文件,你需要自己弄清楚它是什么:

without_ext = os.path.splitext(os.path.basename(__file__))[0]
with_new_ext = os.path.extsep.join(without_ext, "py")

有时,.py文件甚至不存在。既然你写了代码,你就不太可能删除它,但有这种可能性。要确保它存在,请使用os.path.isfile()

最新更新