似乎在 OS X 10.8(使用 Python 2.7)上,.pyc
即使您设置了环境变量,也会创建文件PYTHONDONTWRITEBYTECODE=1
如何防止这种情况发生,或者如何说服 Python 不要在与源文件相同的位置创建这些文件。
似乎在 OS X 10.8(使用 Python 2.7)上,.pyc
即使您设置了环境变量,也会创建文件PYTHONDONTWRITEBYTECODE=1
如何防止这种情况发生,或者如何说服 Python 不要在与源文件相同的位置创建这些文件。
我刚刚对此进行了测试,它在 10.8.2 和 Apple 安装的 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
,您将得到相同的结果。
它还适用于 Apple 安装的 10.5-10.7 中的所有 Python,以及我在可用的各种机器上拥有的所有 python.org、Enthought、MacPorts 和 Homebrew Python,以及两个上的标准 python 包不同的Linux发行版。
因此,如果这是一个错误,它是一个非常具体的错误,这意味着您必须准确地告诉我们哪个 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
,但是export
错误的变量(通常是不小心误用历史以试图节省一些击键)。PYTHONDOTWRITEBYTECODE
都很好……</li>
python
.~/.bash_profile
,而不是重新加载它或启动一个新的外壳,而是想“我会直接做同样的事情”,然后做一些愚蠢的错字,然后花半个小时看看.bash_profile
我之前做错了什么想看看我的shell历史。subprocess
使用/ /whatever从另一个 Python 脚本启动一个 Python 脚本os.exec*
,不遗余力地要求一个干净的环境,然后想知道为什么我的环境变量没有出现。execl
使用而不是从 C 启动 Python execle
,因此您的预期envp
参数无效。(在某些平台上,这可能是段错误,但不是 x86/x64 OS X。)无论如何,如果您在终端中手动尝试过,请再试一次。
如果您在您的.bash_profile
、启动器 shell 脚本、启动器 Python 脚本或其他任何东西中执行此操作,请向我们展示相关代码,有人会立即发现您的愚蠢错误。如果他们嘲笑你,告诉他们阅读我的回答,这样他们就可以嘲笑我了。
PS,请注意,我在测试中做了export PYTHONDONTWRITEBYTECODE=1
而不是单独的PYTHONDONTWRITEBYTECODE=1
和export PYTHONDONTWRITEBYTECODE
行。我总是这样做,除了必须是可移植的 shell 脚本,因为调试在没有直接导出语法的老式 shell 上尝试这个时得到的明显错误比调试由我在上面列出的所有愚蠢错误。
您可以避免同时创建 .pyc 和 .pyo 文件:python -B script.py
按照 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
我会在你的 python 脚本的顶部建议这个:
#!/usr/bin/env python -B
或者,使用sys.dont_write_bytecode方法。
另请参阅:如何避免 .pyc 文件?这提出了一些其他的解决方案,包括一种在 2.6 之前的 python 中工作的方法。