似乎在 OS X 10.8(使用 Python 2.7)上,即使您设置了环境变量 PYTHONDONTWRITEBYTECODE=1
.pyc
文件
如何防止这种情况发生,或者如何说服 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
,并且你会得到相同的结果。
它还适用于 10.5-10.7 的所有 Apple 安装的 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
,即使它没有定义任何东西。 导出 $PYTHONDONTWRITEBYTECODE
。 (您可以通过将其设置为无效标识符来避免这种情况,例如1
。)- 记住要
export
,但是export
是错误的变量(通常是粗心地误用了历史以试图节省几次击键)。 - 打字错误。无论你盯着
PYTHONDOTWRITEBYTECODE
看多少次,它看起来都很好...... - 在终端中进行一些设置,切换到另一个窗口,返回到错误的终端窗口,然后运行
python
。 - 编辑
~/.bash_profile
,而不是重新加载它或启动一个新的 shell,计算“我将直接做同样的事情”,并犯一些愚蠢的错字,然后花半小时查看我的.bash_profile
,看看我做错了什么,然后再考虑查看我的 shell 历史记录。 - 使用
subprocess
/os.exec*
/whatever 从另一个启动一个 Python 脚本,特意要求一个干净的环境,然后想知道为什么我的环境变量未显示。 - 使用
execl
而不是execle
从 C 启动 Python,因此您预期的envp
参数无效。 (在某些平台上,这可能会导致段错误,但 x86/x64 OS X 不会。)
无论如何,如果您在终端中手动尝试过此操作,请重试。
如果您在 .bash_profile
、启动器 shell 脚本、启动器 Python 脚本或其他任何东西中执行此操作,请向我们展示相关代码,其他人会立即发现您的愚蠢错误。如果他们 mock 你,请告诉他们阅读我的回答,这样他们就会 mock 我。
PS,请注意,我在测试中确实 export PYTHONDONTWRITEBYTECODE=1
而不是单独的 PYTHONDONTWRITEBYTECODE=1
和 export PYTHONDONTWRITEBYTECODE
行。我总是这样做,除非在必须可移植的 shell 脚本中,因为调试在没有直接导出语法的老式 shell 上尝试此操作时遇到的明显错误比调试由以下原因引起的问题更容易我在上面列出的所有愚蠢错误。
关于python - 如何避免使用 Python 2.7 在 OS X 10.8 上创建 .pyc 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13627686/