8

似乎在 OS X 10.8(使用 Python 2.7)上,.pyc即使您设置了环境变量,也会创建文件PYTHONDONTWRITEBYTECODE=1

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

4

4 回答 4

18

我刚刚对此进行了测试,它在 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

您可以pythonpython2.7python2.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=1export PYTHONDONTWRITEBYTECODE行。我总是这样做,除了必须是可移植的 shell 脚本,因为调试在没有直接导出语法的老式 shell 上尝试这个时得到的明显错误比调试由我在上面列出的所有愚蠢错误。

于 2012-12-15T01:55:45.453 回答
6

您可以避免同时创建 .pyc 和 .pyo 文件:python -B script.py

于 2012-11-29T16:20:02.607 回答
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
于 2012-12-16T21:35:24.417 回答
1

我会在你的 python 脚本的顶部建议这个:

#!/usr/bin/env python -B

或者,使用sys.dont_write_bytecode方法。

另请参阅:如何避免 .pyc 文件?这提出了一些其他的解决方案,包括一种在 2.6 之前的 python 中工作的方法。

于 2012-12-18T11:53:12.390 回答