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

时间:2012-07-03 19:42:01

标签: python

python的-S选项由文档定义为“禁用模块站点的导入以及它所需的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 个答案:

答案 0 :(得分:8)

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

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

您可以自己查看site.py,看看它在做什么。它只是常规库目录中的一个模块。至少在我的系统上,看起来它有四个主要内容:

  • 设置网站包路径
  • 设置默认编码
  • 定义了一些辅助功能,供交互式使用(quithelp
  • 设置用户特定的网站自定义

如上所述,第一个可能是最关键的。第二个对于执行字符串I / O非常重要,具体取决于系统的区域设置(例如,如果未正确设置默认编码,则可能会出错)。第三个可能不那么重要。如果您希望进行每用户路径自定义(让用户拥有自己的个人库目录等),那么最后一个可能很重要。

答案 1 :(得分:3)

-S标志执行以下操作:

  

不要在初始化时暗示'导入网站'

这意味着在初始化Python期间不会导入模块site。简要说明是此模块“将特定于站点的路径附加到模块搜索路径并添加一些内置”。没有完成所有这些工作确实会使启动更快。

使用文档作为指南,-S标志会产生:

  • sys.path未添加任何其他模块。您可以通过启动pythonpython -S并在import sys; print sys.path中执行以下操作来比较差异。许多模块将无法使用,因此您将无法导入它们。
  • 不会运行自定义网站初始化代码(可以在名为sitecustomize的模块中定义。)
  • 不会运行自定义初始化代码(可以在名为usercustomize的模块中定义。)

您的问题的简短答案是:是的,它使Python启动更快,但许多模块和自定义代码将不可用或不可能。

如果您主要导入自己的模块并编写自己的计算/代码,那么-S标志就可以了。但是,如果您安装了在不同位置安装模块的Python安装,那么您将无法将它们与-S标志一起使用。

答案 2 :(得分: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别名)。