看起来在OS X 10.8(使用Python 2.7)中即使设置了环境变量PYTHONDONTWRITEBYTECODE=1
,.pyc
文件仍会被创建。
我该如何防止这种情况发生,或者如何说服Python不在源文件的同一位置创建这些文件。
看起来在OS X 10.8(使用Python 2.7)中即使设置了环境变量PYTHONDONTWRITEBYTECODE=1
,.pyc
文件仍会被创建。
我该如何防止这种情况发生,或者如何说服Python不在源文件的同一位置创建这些文件。
我刚刚测试了一下,使用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.7
、python2.6
或python2.5
,结果是一样的。这也适用于从10.5-10.7安装的所有Apple自带Python版本,以及我拥有的各种机器上的所有python.org、Enthought、MacPorts和Homebrew Pythons,以及两个不同Linux发行版的标准python包。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脚本或其他任何东西中执行此操作,请向我们展示相关代码,有人将立即找到您的愚蠢错误。如果他们嘲笑你,告诉他们阅读我的答案,这样他们就可以取笑我了。export PYTHONDONTWRITEBYTECODE=1
而不是分开的PYTHONDONTWRITEBYTECODE=1
和export PYTHONDONTWRITEBYTECODE
行。除了需要可移植性的shell脚本之外,我总是这样做,因为在尝试在没有直接导出语法的老式shell上执行此操作时,调试明显错误要比调试我列出的所有愚蠢错误造成的问题容易得多。python -B script.py
按照Abarnert的描述来设置环境确实是正确的方式,但如果由于某些原因在您的设置中无法实现,您可以在代码中运行时进行设置。
只需将以下内容添加到脚本顶部:
import sys
sys.dont_write_bytecode = True
$ 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
#!/usr/bin/env python -B
或者,使用sys.dont_write_bytecode方法。
另请参阅:如何避免 .pyc 文件?,其中提供了一些其他解决方案,包括一种适用于 Python 2.6 之前版本的方法。
os.environ['PYTHONDONTWRITEBYTECODE']
,您会得到什么? - Mark Ransom