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)
你可以python用python2.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脚本,不断寻求干净的环境,然后想知道为什么我的环境变量没有出现.execl而不是execle,因此您的预期envp参数无效.(在某些平台上,这可能是段错误,但不是x86/x64 OS X.)无论如何,如果您在终端中手动尝试此操作,请再试一次.
如果您在自己.bash_profile的启动器shell脚本,启动器Python脚本或其他任何内容中执行此操作,请向我们显示相关代码,并且有人会立即发现您的愚蠢错误.如果他们嘲笑你,告诉他们阅读我的答案,这样他们就可以嘲笑我了.
PS,请注意我在测试中没有export PYTHONDONTWRITEBYTECODE=1单独PYTHONDONTWRITEBYTECODE=1和export PYTHONDONTWRITEBYTECODE行.我总是这样做,除非有可移植的shell脚本,因为它更容易调试公然错误当一个老派的外壳尝试这种不具备直接出口语法,你获得比调试所造成的问题我上面列出的所有愚蠢的错误.
按照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)