Answers:
现在,可以通过将-B开关提供给Python解释器,或者通过在运行解释器之前设置 PYTHONDONTWRITEBYTECODE环境变量来阻止Python编写.pyc或.pyo文件。此设置可作为Python程序的
sys.dont_write_bytecode
变量使用,并且Python代码可以更改该值以修改解释程序的行为。
2010年11月27日更新:Python 3.2 .pyc
通过引入一个特殊的__pycache__
子文件夹解决了源文件夹中文件混乱的问题,请参阅Python 3.2-PYC存储库目录中的新增功能。
export PYTHONDONTWRITEBYTECODE=1
import sys
sys.dont_write_bytecode = True
site-packages/usercustomize.py
以使其适用于所有脚本。对我而言,该目录为$HOME/.local/lib/python2.6/site-pacakges/usercustomize.py
。cf. docs.python.org/2/tutorial/...
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文件,则导入可能会相当缓慢。
因此,您要做的就是将文件压缩,将压缩文件添加到sys.path中,然后导入它们。
如果要针对UNIX构建此脚本,则还可以考虑使用以下配方打包脚本: unix zip可执行文件,但是请注意,如果计划使用stdin或从sys.args读取任何内容,则可能必须对其进行调整(可以做得没有太多麻烦)。
根据我的经验,性能不会因此受到太大影响,但是在以这种方式导入任何非常大的模块之前,您应该三思。
您可以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
我在一个测试套件中有几个测试用例,在像这样在Mac Terminal中运行测试套件之前,我是这样的:
python LoginSuite.py
以这种方式运行命令,我的目录中填充了.pyc文件。我尝试了以下陈述的方法,它解决了问题:
python -B LoginSuite.py
如果要将测试用例导入测试套件并在命令行上运行套件,则此方法有效。
从Python 3.8开始,您可以使用环境变量PYTHONPYCACHEPREFIX
为Python定义一个缓存目录。
从Python文档中:
如果设置了该选项,Python将在此路径的镜像目录树中而不是源树中的pycache目录中写入.pyc文件。这等效于指定-X pycache_prefix = PATH选项。
例
如果./profile
将以下行添加到Linux中:
export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"
Python不会__pycache__
在您的项目目录中创建恼人的目录,而是将所有这些目录置于~/.cache/cpython/
据我所知,python将编译您“导入”的所有模块。但是python不会编译使用以下命令运行的python脚本:“ python script.py”(但是它将编译该脚本导入的所有模块)。
真正的问题是为什么您不希望python编译模块?如果它们阻碍了您的工作,您可能会自动采取一种清理方法。
.pyc
文件。由于某种原因,当我更改类/模块时,.pyc
文件不会更新。因此,当我在更改.py
文件后导入它时,它仍然会使用该.pyc
文件,从而导致错误