如何避免.pyc文件?
我可以在不生成编译的.pyc文件的情况下运行python解释器吗?
从“Python 2.6新增function – 解释器更改” :
Python现在可以通过将-B开关提供给Python解释器,或者在运行解释器之前设置PYTHONDONTWRITEBYTECODE环境variables来防止写入.pyc或.pyo文件。 这个设置作为
sys.dont_write_bytecode
variables在Python程序中可用,Python代码可以改变这个值来修改解释器的行为。
更新2010-11-27:Python 3.2通过引入特殊的__pycache__
子文件夹来解决使用.pyc
文件__pycache__
源文件夹的问题,请参阅Python 3.2中的新增function – PYC存储库目录 。
import sys sys.dont_write_bytecode = True
实际上有一种方法可以在Python 2.3+中完成,但是有点深奥。 我不知道你是否意识到这一点,但你可以做到以下几点:
$ unzip -l /tmp/example.zip Archive: /tmp/example.zip Length Date Time Name -------- ---- ---- ---- 8467 11-26-02 22:30 jwzthreading.py -------- ------- 8467 1 file $ ./python Python 2.3 (#1, Aug 1 2003, 19:54:32) >>> import sys >>> sys.path.insert(0, '/tmp/example.zip') # Add .zip file to front of path >>> import jwzthreading >>> jwzthreading.__file__ '/tmp/example.zip/jwzthreading.py'
根据zipimport库:
ZIP档案中可能存在任何文件,但只有文件.py和.py [co]可用于导入。 dynamic模块(.pyd,.so)的ZIP导入是不允许的。 请注意,如果存档文件只包含.py文件,则Python不会尝试通过添加相应的.pyc或.pyo文件来修改存档文件,这意味着如果ZIP存档文件不包含.pyc文件,导入可能会相当慢。
因此,你所要做的就是压缩文件,将zip文件添加到你的sys.path中,然后导入它们。
如果你正在为UNIX构build,你也可以考虑使用这个配方打包你的脚本: unix zip可执行文件 ,但是请注意,如果你打算使用stdin或者从sys.args中读取任何东西,你可能需要调整它(它可以是没有太多的麻烦)。
在我的经验中,性能不会因为这个而受到太多的影响,但是在以这种方式导入任何非常大的模块之前,您应该三思而行。
在2.5中,除了不给用户写目录的权限之外,没有办法压制它。
然而,在Python 2.6和3.0中,sys模块中可能会有一个名为“dont_write_bytecode”的设置可以设置为禁止这个设置。 这也可以通过传递“-B”选项来设置,或者设置环境variables“PYTHONDONTWRITEBYTECODE”
你可以在你的源文件中设置sys.dont_write_bytecode = True
,但是必须在第一个加载的python文件中。 如果你执行python somefile.py
那么你将不会得到somefile.pyc
。
当您使用setup.py
和entry_points=
安装实用程序时,您将在启动脚本中设置sys.dont_write_bytecode
。 所以你不能依赖setuptools生成的“default”启动脚本。
如果你自己用python文件作为参数启动Python,你可以指定-B
:
python -B somefile.py
somefile.pyc
不会被生成,但其他文件也不会导入.pyc
文件。
如果你有一些实用程序myutil
,你不能改变它,它不会传递-B到Python解释器。 通过设置环境variablesPYTHONDONTWRITEBYTECODE
启动它:
PYTHONDONTWRITEBYTECODE=x myutil
我在testing套件中有几个testing用例,并且在Mac Terminal中运行testing套件之前,像这样:
python LoginSuite.py
以这种方式运行命令我的目录正在填充.pyc文件。 我尝试了下面的方法,它解决了这个问题:
python -B LoginSuite.py
如果您将testing用例导入testing套件并在命令行上运行该套件,则此方法有效。
据我所知python会编译所有你“导入”的模块。 然而,python不会编译使用“python script.py”运行的python脚本(它将编译脚本导入的任何模块)。
真正的问题是为什么你不想Python来编译模块? 如果他们挡道,你可能会自动清理这些东西。
您可以使Python模块以Python解释器运行的用户的只读模式存在。
我不认为有一个更优雅的select。 PEP304似乎试图为此引入一个简单的select,但似乎已被放弃。
我想可能还有其他一些问题要解决,因为禁用.py [co]似乎是一个解决方法,但是最好是攻击这个原始的问题。