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

sor*_*rin 8 python macos pyc python-2.7 osx-mountain-lion

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

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

aba*_*ert 18

我刚刚对此进行了测试,并且在Apple安装的Python 2.7上它在10.8.2上工作正常.

$ 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
Run Code Online (Sandbox Code Playgroud)

你可以pythonpython2.7,, python2.6或者替换,python2.5你会得到相同的结果.

它也适用于10.5-10.7的所有Apple安装的Pythons,以及我可以在各种机器上使用的所有python.org,Enthought,MacPorts和Homebrew Pythons,以及两个标准的python包不同的Linux发行版.

因此,如果这一个错误,它是一个非常具体的错误,这意味着你必须告诉我们究竟哪个Python(以及你如何安装它,如果不是库存),以及哪个OS X 10.8.

它更有可能PYTHONDONTWRITEBYTECODE不在python的环境中.正如Mark Ransom建议的那样,您可以通过添加以下内容来验证:

import os
print 'PYTHONDONTWRITEBYTECODE is', os.environ.get('PYTHONDONTWRITEBYTECODE', None)
Run Code Online (Sandbox Code Playgroud)

如果它说None,这就是问题所在.

所以,PYTHONDONTWRITEBYTECODE不在您的环境中.但是你说这在你的呼叫环境中.怎么可能?好吧,如果你正在使用bash,最可能的原因是你忘了它export.在所有愚蠢的方法中,这是我做得最多的那个.但这里有一些我做过的蠢事:

  • 忘了export.你可以echo $PYTHONDONTWRITEBYTECODE想要它,并且它已经清楚地设定了,但却python没有看到它......
  • 记住export,但忘了设置它.即使它没有被定义为任何东西,也bash可以让你export PYTHONDONTWRITEBYTECODE.
  • export $PYTHONDONTWRITEBYTECODE.(您可以通过将其设置为不是有效标识符来避免这种情况,例如1.)
  • 记住export,但export错误的变量(通常是通过不小心滥用历史记录来试图保存几次击键).
  • 错字.无论你多少次盯着PYTHONDOTWRITEBYTECODE它看起来都很好......
  • 在终端中进行一些设置,切换到另一个窗口,返回错误的终端窗口,然后运行python.
  • 编辑~/.bash_profile,和不是重新加载它或启动一个新的外壳,数字"我就直接做同样的事情",并做出一些愚蠢的错字,再花半小时在看我.bash_profile,看看我以前错了想着看看我的shell历史.
  • 使用subprocess/ os.exec*/ 启动一个来自另一个的Python脚本,不断寻求干净的环境,然后想知道为什么我的环境变量没有出现.
  • 从C启动Python execl而不是execle,因此您的预期envp参数无效.(在某些平台上,这可能是段错误,但不是x86/x64 OS X.)

无论如何,如果您在终端中手动尝试此操作,请再试一次.

如果您在自己.bash_profile的启动器shell脚本,启动器Python脚本或其他任何内容中执行此操作,请向我们显示相关代码,并且有人会立即发现您的愚蠢错误.如果他们嘲笑你,告诉他们阅读我的答案,这样他们就可以嘲笑我了.

PS,请注意我在测试中没有export PYTHONDONTWRITEBYTECODE=1单独PYTHONDONTWRITEBYTECODE=1export PYTHONDONTWRITEBYTECODE行.我总是这样做,除非有可移植的shell脚本,因为它更容易调试公然错误当一个老派的外壳尝试这种不具备直接出口语法,你获得比调试所造成的问题我上面列出的所有愚蠢的错误.


dav*_*off 6

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


cne*_*son 5

按照abarnert的描述设置环境实际上是正确的方法,但如果由于某种原因在您的设置中无法实现,您可以在运行时在代码中进行设置.

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

import sys
sys.dont_write_bytecode = True
Run Code Online (Sandbox Code Playgroud)

这将使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
Run Code Online (Sandbox Code Playgroud)