如何在使用Python 2.7的OS X 10.8上避免创建.pyc文件?

9

看起来在OS X 10.8(使用Python 2.7)中即使设置了环境变量PYTHONDONTWRITEBYTECODE=1.pyc文件仍会被创建。

我该如何防止这种情况发生,或者如何说服Python不在源文件的同一位置创建这些文件。


4
为什么你想要这样做? - Fabian
1
另一个选择是使用“-B”调用解释器。 - Steven Rumbalski
如果您尝试打印 os.environ['PYTHONDONTWRITEBYTECODE'],您会得到什么? - Mark Ransom
https://dev59.com/aHVC5IYBdhLWcg3w4Vb6 - mher
1
@Fabian,我想这样做是因为有时候你会从“源”目录执行Python,而你不希望在那里留下中间/缓存文件,比如*.pyc。这不是很明显吗?请注意,我不是问题的原始发布者。 - Armen Michaeli
4个回答

20

我刚刚测试了一下,使用10.8.2版本的苹果自带Python 2.7,它可以正常工作。

$ echo -e 'import bar\n' > foo.py
$ echo -e 'pass\n' > bar.py
$ export PYTHONDONTWRITEBYTECODE=1
$ python foo.py
$ ls -l bar.py*
-rw-r--r--  1 abarnert  staff    6 Dec 14 17:25 bar.py
$ unset PYTHONDONTWRITEBYTECODE
$ python foo.py
$ ls -l bar.py*
-rw-r--r--  1 abarnert  staff    6 Dec 14 17:25 bar.py
-rw-r--r--  1 abarnert  staff  118 Dec 14 17:26 bar.pyc
你可以将python替换为python2.7python2.6python2.5,结果是一样的。这也适用于从10.5-10.7安装的所有Apple自带Python版本,以及我拥有的各种机器上的所有python.org、Enthought、MacPorts和Homebrew Pythons,以及两个不同Linux发行版的标准python包。
因此,如果这是一个bug,它是非常具体的,这意味着你必须告诉我们确切的Python版本(如果不是默认版本还要告诉我们如何安装),以及OS X 10.8的版本。
更有可能的情况是PYTHONDONTWRITEBYTECODE在python的环境中不存在。正如Mark Ransom建议的那样,您可以通过添加以下内容进行验证:
import os
print 'PYTHONDONTWRITEBYTECODE is', os.environ.get('PYTHONDONTWRITEBYTECODE', None)
如果显示为None,那么这就是问题所在。
因此,PYTHONDONTWRITEBYTECODE不在您的环境中。但是您说它在您的调用环境中。这怎么可能?嗯,如果您使用的是bash,最有可能的原因是您忘记了export它。在所有愚蠢的方法中,这是我做过最多的一种。但这里还有一些我做过的愚蠢的事情:
- 忘记export。您可以echo $PYTHONDONTWRITEBYTECODE以查看是否已经设置好了,但是python并没有看到它... - 记得export,但忘记设置它。即使未定义任何内容,bash也允许您export PYTHONDONTWRITEBYTECODE。 - export $PYTHONDONTWRITEBYTECODE。(您可以将其设置为非有效标识符的内容,例如1,从而避免此错误。) - 记得export,但导出了错误的变量(通常是由于粗心使用历史记录,试图节省一些按键次数)。 - 打字错误。无论你看多少次PYTHONDOTWRITEBYTECODE都没问题... - 在终端中进行一些设置,切换到另一个窗口,回到错误的终端窗口并运行python。 - 编辑~/.bash_profile,而不是重新加载它或启动一个新的shell,认为"我会直接做同样的事情",然后犯了一些愚蠢的打字错误,然后花费半小时查看自己的.bash_profile以查找错误之前,想着查看自己的shell历史。 - 使用subprocess/os.exec*或其他方法从一个Python脚本中启动另一个Python脚本,并费尽心思地请求一个干净的环境,然后想知道为什么我的环境变量没有出现。 - 使用execl而不是execle从C启动Python,因此您想要的envp参数没有效果。(在某些平台上,这可能导致segmentation fault,但不适用于x86/x64 OS X。)
无论如何,如果您在终端手动尝试过,请再试一次。
如果您正在.bash_profile、启动器shell脚本、启动器Python脚本或其他任何东西中执行此操作,请向我们展示相关代码,有人将立即找到您的愚蠢错误。如果他们嘲笑你,告诉他们阅读我的答案,这样他们就可以取笑我了。
PS,请注意,我在测试中使用了export PYTHONDONTWRITEBYTECODE=1而不是分开的PYTHONDONTWRITEBYTECODE=1export PYTHONDONTWRITEBYTECODE行。除了需要可移植性的shell脚本之外,我总是这样做,因为在尝试在没有直接导出语法的老式shell上执行此操作时,调试明显错误要比调试我列出的所有愚蠢错误造成的问题容易得多。

6
您可以通过以下命令避免创建.pyc和.pyo文件:python -B script.py

我不想改变调用Python的命令行,这样根本不可扩展。我认为有一个错误,它不关心ENV变量。 - sorin
你是如何执行Python的?如果你是通过某种bash脚本或其他方法执行的,可能会导致环境被重置。 - dave mankoff

5

按照Abarnert的描述来设置环境确实是正确的方式,但如果由于某些原因在您的设置中无法实现,您可以在代码中运行时进行设置。

只需将以下内容添加到脚本顶部:

import sys
sys.dont_write_bytecode = True

这将防止Python在此之后生成任何字节码。
$ cat > foo.py
#sample module
FOO="BAR"

$ python
>>> import sys
>>> sys.dont_write_bytecode = True
>>> import foo
>>> foo.FOO
'BAR'
>>> ^D

$ ls *.pyc
ls: *.pyc: No such file or directory

1
我建议您在Python脚本的顶部添加以下内容:
#!/usr/bin/env python -B

或者,使用sys.dont_write_bytecode方法。

另请参阅:如何避免 .pyc 文件?,其中提供了一些其他解决方案,包括一种适用于 Python 2.6 之前版本的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接