如何避免在使用Python 2.7的OS X 10.8上创建.pyc文件?
似乎在OS X 10.8(使用Python 2.7)上创建了如何避免在使用Python 2.7的OS X 10.8上创建.pyc文件?,python,macos,python-2.7,osx-mountain-lion,pyc,Python,Macos,Python 2.7,Osx Mountain Lion,Pyc,似乎在OS X 10.8(使用Python 2.7)上创建了.pyc文件,即使您设置了环境变量PYTHONDONTWRITEBYTECODE=1 如何防止这种情况发生,或者如何说服Python不要在与源文件相同的位置创建此文件。使用:Python-B script.py可以避免创建.pyc和.pyo文件。我刚刚测试了这一点,在10.8.2上安装了Apple安装的Python 2.7 $ echo -e 'import bar\n' > foo.py $ echo -e 'pass\n' &
.pyc
文件,即使您设置了环境变量PYTHONDONTWRITEBYTECODE=1
如何防止这种情况发生,或者如何说服Python不要在与源文件相同的位置创建此文件。使用:
Python-B script.py
可以避免创建.pyc和.pyo文件。我刚刚测试了这一点,在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
您可以将python2.7
、python2.6
或python2.5
替换为python2.7
,您将得到相同的结果
它还可以与苹果安装的10.5-10.7版本的所有python、python.org、enthough、MacPorts和自制python一起使用,这些python都可以在我可以使用的各种机器上使用,标准python包可以在两个不同的linux发行版上使用
因此,如果这是一个bug,那么它是一个非常具体的bug,这意味着您必须准确地告诉我们哪种Python(以及您如何安装它,如果不是库存的话),以及哪种OS X 10.8
更有可能的是,pythondowwritebytecode
不在python的环境中。正如Mark Ransom所建议的,您可以通过添加以下内容来验证这一点:
import os
print 'PYTHONDONTWRITEBYTECODE is', os.environ.get('PYTHONDONTWRITEBYTECODE', None)
如果它说None
,这就是问题所在
因此,pythondotwritebytecode
不在您的环境中。但你说这是在你的通话环境中。这怎么可能?如果您使用的是bash
,最可能的原因是您忘记了导出它。在所有愚蠢的方法中,这是我做得最多的一种。但我做了一些愚蠢的事情:
- 忘记导出。你可以
你想要的,它已经设置得很清楚了,但是echo$pythondotwritebytecode
没有看到它python
- 记住导出,但忘记设置它
允许您bash
,即使它没有定义为任何内容导出pythondotwritebytecode
。(您可以通过将其设置为无效标识符来避免此错误,如导出$pythondotwritebytecode
)1
- 请记住
,但是导出
的变量错误(通常是为了保存一些击键而不小心误用历史记录)导出
- 打字错误。不管你盯着
看多少次,它看起来都很好PYTHONDOTWRITEBYTECODE
- 在终端中进行一些设置,切换到另一个窗口,返回错误的终端窗口,然后运行
python
- 编辑
,而不是重新加载它或启动一个新的shell,想象“我会直接做同样的事情”,然后做一些愚蠢的输入错误,然后花半个小时查看我的~/.bash\u配置文件
,看看我在考虑查看shell历史记录之前出错了什么.bash\u配置文件
- 使用
/subprocess
/不管怎样,从另一个Python脚本启动一个Python脚本,不厌其烦地要求一个干净的环境,然后想知道为什么我的环境变量没有出现os.exec*
- 使用
而不是execl
从C启动Python,因此您想要的execle
参数没有效果。(在某些平台上,这可能会导致故障,但不会导致x86/x64 OS X。)envp
.bash\u配置文件中执行此操作,那么一个启动器shell脚本、启动器Python脚本或其他任何脚本都会向我们显示相关代码,有人会立即发现您的愚蠢错误。如果他们嘲笑你,告诉他们读我的答案,这样他们就可以取笑我了
请注意,我在测试中确实导出了pythontwritebytecode=1,而不是单独的pythontwritebytecode=1
和导出pythontwritebytecode
行。我总是这样做,除了shell脚本必须是可移植的,因为在没有直接导出语法的老式shell上尝试此操作时,调试明显错误要比调试上面列出的所有愚蠢错误所导致的问题更容易。按照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
或者,使用该方法
另请参阅:这建议了一些其他解决方案,包括一种在2.6 python之前工作的方法。为什么要这样做?另一个选项是使用-B
调用解释器。如果您尝试打印os.environ['pythontwritebytecode']
您得到了什么?@Fabian,我希望这样做,因为有时您从“source”目录执行Python,而不希望在其中包含像*.pyc这样的中间/缓存文件。这不是很明显吗?请注意,我不是这个问题的发帖人,我不想改变调用python的命令行,它根本不可伸缩。我认为存在一个bug,它不关心ENV变量。您是如何执行Python的?如果您是通过某种bash脚本或其他方法执行的,则可能是以某种方式重置了环境。