【问题标题】:How to avoid creation of .pyc files on OS X 10.8 with Python 2.7?如何避免使用 Python 2.7 在 OS X 10.8 上创建 .pyc 文件?
【发布时间】:2012-11-29 14:13:51
【问题描述】:

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

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

【问题讨论】:

  • 你为什么要这样做?
  • 另一种选择是使用-B 调用解释器。
  • 如果您尝试打印os.environ['PYTHONDONTWRITEBYTECODE'],您会得到什么?
  • @Fabian,我想这样做,因为有时您从“源”目录执行 Python,而您不希望其中有像 *.pyc 这样的中间/缓存文件。不是很明显吗?请注意,我不是问题的原始发帖人。

标签: python macos python-2.7 osx-mountain-lion pyc


【解决方案1】:

我刚刚对此进行了测试,它在 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.7python2.6python2.5,您将得到相同的结果。

它还适用于 Apple 安装的 10.5-10.7 的所有 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 即使它没有定义任何东西。
  • export $PYTHONDONTWRITEBYTECODE。 (您可以通过将其设置为无效标识符来避免这种情况,例如 1。)
  • 请记住 export,但 export 错误的变量(通常是不小心误用历史记录以试图保存一些击键)。
  • 错字。不管你盯着PYTHONDOTWRITEBYTECODE看多少次,它看起来都很好……
  • 在终端中进行一些设置,切换到另一个窗口,回到错误的终端窗口,然后运行python
  • 编辑~/.bash_profile,而不是重新加载它或启动一个新的shell,想象“我会直接做同样的事情”,然后打一些愚蠢的错字,然后花半个小时看我的@ 987654345@ 看看我做错了什么,然后再考虑查看我的 shell 历史记录。
  • 使用subprocess/os.exec*/whatever 从另一个 Python 脚本启动一个 Python 脚本,特意要求一个干净的环境,然后想知道为什么我的环境变量没有显示。
  • 使用execl 而不是execle 从C 启动Python,因此您想要的envp 参数无效。 (在某些平台上,这可能会出现段错误,但 x86/x64 OS X 不会。)

无论如何,如果您在终端中手动尝试过,请再试一次。

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

PS,请注意,我在测试中使用了 export PYTHONDONTWRITEBYTECODE=1 而不是单独的 PYTHONDONTWRITEBYTECODE=1export PYTHONDONTWRITEBYTECODE 行。我总是这样做,除了必须是可移植的 shell 脚本,因为调试在没有直接导出语法的老式 shell 上尝试这个时得到的明显错误比调试由我在上面列出的所有愚蠢错误。

【讨论】:

    【解决方案2】:

    您可以避免创建 .pyc 和 .pyo 文件:python -B script.py

    【讨论】:

    • 我不想更改调用 python 的命令行,它根本无法扩展。我认为有一个错误,它不关心 ENV 变量。
    • 你是如何执行 Python 的?如果您通过某种 bash 脚本或其他方法执行,则可能是环境正在以某种方式重置。
    【解决方案3】:

    按照 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
    

    【讨论】:

      【解决方案4】:

      我会在你的 python 脚本的顶部建议这个:

      #!/usr/bin/env python -B
      

      或者,使用sys.dont_write_bytecode 方法。

      另请参阅:How to avoid .pyc files?,它提出了一些其他解决方案,包括一种适用于 2.6 之前的 python 的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        • 2013-05-27
        • 2013-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多