Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免在使用Python 2.7的OS X 10.8上创建.pyc文件?_Python_Macos_Python 2.7_Osx Mountain Lion_Pyc - Fatal编程技术网

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

如何避免在使用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' &

似乎在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' > 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
  • 编辑
    ~/.bash\u配置文件
    ,而不是重新加载它或启动一个新的shell,想象“我会直接做同样的事情”,然后做一些愚蠢的输入错误,然后花半个小时查看我的
    .bash\u配置文件
    ,看看我在考虑查看shell历史记录之前出错了什么
  • 使用
    subprocess
    /
    os.exec*
    /不管怎样,从另一个Python脚本启动一个Python脚本,不厌其烦地要求一个干净的环境,然后想知道为什么我的环境变量没有出现
  • 使用
    execl
    而不是
    execle
    从C启动Python,因此您想要的
    envp
    参数没有效果。(在某些平台上,这可能会导致故障,但不会导致x86/x64 OS X。)
无论如何,如果您在终端中手动尝试此操作,请重试

如果您在
.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脚本或其他方法执行的,则可能是以某种方式重置了环境。