运行os.path.basename(__file__)
有时会将文件名设为foo.py
,但有时会提供foo.pyc
。我知道pyc是编译后的文件,它可能在编译后每次都使用。我很困惑为什么basename
会返回pyc文件名?这是正常的吗?其次,如何让它始终返回未编译的文件名或没有扩展名?
答案 0 :(得分:4)
在Python 2中,__file__
反映了为模块 * 实际加载的文件。导入模块时,Python会尝试首先找到.pyc
文件,如果发现该文件是使用的文件名,否则它将成为.py
文件。
可能如果__file__
指向解释器的 next 运行中的.py
,您会发现它已加载一个.pyc
文件,因为Python会尝试创建一个缓存文件。另请注意,不可能是.py
源文件;某些项目仅以.pyc
文件的形式分发。最后但同样重要的是,Python从不为顶级脚本创建.pyc
文件。
生成.py
源文件文件名的故障安全方法是简单地从结尾剥离c
;您可以包含d
来处理.pyd
个文件(优化的字节码,目前只剥离断言):
sourcefile = __file__.rstrip('cd')
检查文件是否确实存在!
* Python 3更改了存储缓存的字节码文件的位置,__file__
即使存在.pyc
文件也会使用源文件路径。
答案 1 :(得分:1)
__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()