我可以在不生成编译的.pyc文件的情况下运行python解释器吗?
从"Python 2.6中的新功能 - 解释器更改":
现在可以通过向Python解释器提供-B开关,或者在运行解释器之前设置 PYTHONDONTWRITEBYTECODE环境变量来阻止Python编写.pyc或.pyo文件.此设置可用作Python程序的
sys.dont_write_bytecode
变量,Python代码可以更改值以修改解释器的行为.
更新2010-11-27:Python 3.2 .pyc
通过引入特殊的__pycache__
子文件夹解决了使用文件混乱源文件夹的问题,请参阅Python 3.2中的新增功能 - 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]可供导入.不允许ZIP导入动态模块(.pyd,.so).请注意,如果存档仅包含.py文件,则Python不会尝试通过添加相应的.pyc或.pyo文件来修改存档,这意味着如果ZIP存档不包含.pyc文件,则导入可能会相当慢.
因此,您所要做的就是压缩文件,将zipfile添加到sys.path然后导入它们.
如果你是为UNIX构建这个,你也可以考虑使用这个配方打包你的脚本: unix zip executable,但是请注意,如果你计划使用stdin或从sys.args读取任何内容,你可能需要调整它(它可以是完成没有太多麻烦).
根据我的经验,性能不会因此而受到太大影响,但在以这种方式导入任何非常大的模块之前,您应该三思而后行.
在2.5中,除了不向用户提供对目录的写访问权之类的措施之外,没有办法压制它.
但是在python 2.6和3.0中,sys模块中可能有一个名为"dont_write_bytecode"的设置可以设置为抑制它.也可以通过传递"-B"选项或设置环境变量"PYTHONDONTWRITEBYTECODE"来设置
您可以sys.dont_write_bytecode = True
在源代码中设置,但必须在加载的第一个python文件中.如果你执行python somefile.py
那么你就不会得到somefile.pyc
.
使用安装实用程序时setup.py
,entry_points=
您将sys.dont_write_bytecode
在启动脚本中进行设置.因此,您不能依赖setuptools生成的"默认"启动脚本.
如果你自己用python文件作为参数启动Python,你可以指定-B
:
python -B somefile.py
somefile.pyc
无论如何都不会生成,但也没有.pyc
导入其他文件的文件.
如果你有一些实用程序myutil
,你不能改变它,它不会将-B传递给python解释器.只需通过设置环境变量启动它PYTHONDONTWRITEBYTECODE
:
PYTHONDONTWRITEBYTECODE=x myutil