我已经理解Python是一种解释型语言......然而,当我查看我的Python源代码时,我看到了.pyc
Windows,它们识别为"编译的Python文件".这些来自哪里?
这些python文件扩展名是什么意思?
它们之间有什么区别?它们是如何从*.py文件生成的?
是否有可能从.py文件生成的.pyc文件中获取一些信息?
我知道".pyc"文件是纯文本".py"文件的编译版本,在运行时创建以使程序运行得更快.但是我发现了一些事情:
rm *.pyc
)后,程序行为有时会发生变化.这表明他们没有在".py"更新时编译.问题:
无意中,我已将.pyc文件推送到主存储库.现在我想删除它们,但我不能这样做.有没有办法直接从Bitbucket网站删除它们?
当我ls
在bash中执行时,我总是看到太多*.pyc
文件.有没有办法隐藏这些文件?
有没有办法让Python忽略任何存在的.pyc文件,并且总是直接解释所有代码(包括导入的模块)?谷歌没有提出任何答案,所以我怀疑没有,但似乎值得问以防万一.
(为什么我要这样做?我有一大堆Python脚本,它们在几百台计算机的集群上重复运行.Python脚本本身存在于一个共享的NFS文件系统上.不知怎的,很少,在运行了数百台之后几个小时的时间,它们会突然开始崩溃,导致无法导入模块的错误.强制重新生成.pyc文件可以解决问题.当然,我想修复根本原因,但是同时我们还需要系统继续运行,所以如果可能的话,忽略.pyc文件似乎是一个合理的解决方法).
PS我正在使用Python 2.5,所以我不能使用-B.
我正在尝试运行Python应用程序而不保留.py
源文件,只依赖于.pyc
编译的文件.但是,当我删除.py
源文件时,我收到导入错误.此功能在Python 2.7中有效,但在3.4中没有(使用新__pycache__
结构).
这是一个示例目录结构:
Run Code Online (Sandbox Code Playgroud)package/ __init__.py module.py
首先让我们看看当我使用Python 2.7时会发生什么(这是所需的行为)
$ python2 -c "from package import module"
$ find package -name "*.py" -delete
$ python2 -c "from package import module"
Run Code Online (Sandbox Code Playgroud)
这一切都很好,不会抛出任何错误.执行此操作后的目录结构如下所示,.pyc
文件与原始.py
文件一起:
Run Code Online (Sandbox Code Playgroud)package/ __init__.pyc module.pyc
现在,让我们用Python 3.4做同样的事情,再次从我们的原始目录结构开始
$ python3 -c "from package import module"
$ find package -name "*.py" -delete
$ python3 -c "from package import module"
Traceback (most recent call last):
File "<string>", line 1, in …
Run Code Online (Sandbox Code Playgroud) 我已经看到几个资源描述了什么.pyc
文件以及它们何时被创建.但现在我想知道为什么在.py
导入文件时创建它们?
另外,为什么不.pyc
为执行导入的主Python文件创建文件?
我猜这与性能优化和学习有关,这鼓励我打破我的文件,因为内置的编译似乎很好用.但是我不确定是不是这种情况,而且我也很好奇是否有人有关于运行带和不带.pyc
文件的程序之间差异的统计数据,如果它确实是速度的话.
我自己运行它们但是我没有一个好的,大的Python代码库来测试它.:(
pyc ×10
python ×9
python-3.x ×3
compiled ×2
bytecode ×1
decompiling ×1
git ×1
linux ×1
ls ×1
path ×1