运行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()