使用Python的-S选项是否安全?

15

根据文档,python的-S选项被定义为“禁用模块site和它所涉及的sys.path相关操作的导入”。我发现在我的机器上使用此选项时,Python启动速度比正常情况下快了两倍以上,有时甚至更多。例如,在一台(较慢的)机器上:

$ time python -c 'print "hello"'   
hello
python -c 'print "hello"'  0.14s user 0.03s system 85% cpu 0.204 total

$ time python -Sc 'print "hello"'
hello
python -Sc 'print "hello"'  0.02s user 0.01s system 73% cpu 0.038 total

这是一个5.3倍的加速。它似乎可以正常工作,至少对我尝试过的脚本来说是这样。使用它有什么缺点吗?

3个回答

9

这可能不是一个好主意。这意味着site-packages目录不会被添加到路径中,因此您将无法导入除标准库模块以外的任何内容:

python -Sc "import numpy"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named numpy

你可以查看 site.py 以了解它在做什么。它只是常规库目录中的一个模块。至少在我的系统上,它似乎有四个主要作用:
  • 设置 site-packages 路径
  • 设置默认编码
  • 为交互式使用定义几个辅助函数(quithelp
  • 设置用户特定的站点自定义
第一个可能是最关键的,如上所述。第二个对于根据您系统的区域设置进行字符串 I/O 可能很重要(即,如果未正确设置默认编码,则可能会出现错误)。第三个可能不是那么重要。最后一个可能很重要,如果您喜欢具有每个用户路径自定义(让用户拥有自己的个人库目录等)。

2
嗯,听起来如果我的程序只支持英文(即懒惰),并且仅依赖于基本的标准Python模块,设置默认编码可能会导致更少的问题(使用.lower()等时不会有太多意外)。因此,在编写一些不做太多事情但启动时间很重要的基本脚本时,这可能是可以接受的。 - apenwarr

3
-S 标志的作用如下:

在初始化时不执行 'import site'

这意味着Python初始化期间不会导入模块site。简要描述一下,此模块"将特定于站点的路径附加到模块搜索路径并添加一些内置项"。不执行这些操作确实可以加快启动速度。
根据文档指南,-S标志的结果为:
  • 不会向sys.path中添加其他模块。您可以通过启动pythonpython -S并使用以下命令在两个终端中比较差异:import sys; print sys.path。许多模块将不可用,因此您将无法导入它们。
  • 不会运行自定义站点初始化代码(可以在名为sitecustomize的模块中定义)。
  • 不会运行自定义初始化代码(可以在名为usercustomize的模块中定义)。
简短回答您的问题是:是的,它可以加快Python的启动速度,但许多模块和自定义代码将不可用或不可能执行。
如果您主要导入自己的模块并编写自己的计算/代码,则使用-S标志即可。但是,如果您安装了不同位置的模块的Python,则无法在-S标志下使用它们。

2

当你这样做时,你将失去模块搜索路径的大部分:

$ python -S
Python 2.6.8 (unknown, Apr 19 2012, 01:24:00) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
>>> import sys
>>> len(sys.path)
9

$ python
Python 2.6.8 (unknown, Apr 19 2012, 01:24:00) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> len(sys.path)
26

根据您的系统,这可能会对可用的模块产生重大影响。

其他可能会出现问题的是语言环境(由site.py设置为系统默认值),在Windows上,一些编解码器将不可用(它们由site.py进行别名处理)。


1
这一切都引出了一个问题:为什么有这么多东西需要放到site-packages中呢?我相信大部分时候这并不是必要的。但由于某种原因,传统上甚至将可能只使用一次的代码也放入site-packages中。在我看来,最好将不被多个应用程序共享的内容放在/usr/local或其他唯一目录下。 - user1277476
因为那是模块应该放置的位置。一般来说,如果安装了一些第三方库,它们就会放在 Python 站点包目录中。还应该放在哪里呢? - BrenBarn
如果你指的是为特定项目创建自己的模块,那么不把它们放在site-packages中也没问题。但是当你安装第三方库时,通常应该将其放在site-packages中,因为如果你安装了某个库,那么很可能意味着你将用它来做一些事情。在我的site-packages目录中,我看到了许多通用的库,如numpy、scipy、matplotlib、gtk、pygame、pyparsing和dabo——这些库可能需要许多Python程序使用。 - BrenBarn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接