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

时间:2016-04-18 11:13:42

标签: python

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

2 个答案:

答案 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()