Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python'安全吗;s-s选项?_Python - Fatal编程技术网

使用python'安全吗;s-s选项?

使用python'安全吗;s-s选项?,python,Python,python的-S选项在文档中定义为“禁用模块站点的导入及其所需的sys.path的站点依赖性操作”。我发现,当我使用此选项时,在我的机器上启动python的速度是这个选项的两倍多,有时甚至更多。例如,在一台(慢速)机器上: 这是5.3倍的加速。而且它似乎工作得很好,至少在我尝试过的脚本中是这样。使用它的缺点是什么?这可能不是个好主意。除其他外,这意味着site packages目录将不会添加到路径中,因此除了标准的lib模块外,您将无法导入任何内容: python -Sc "import nu

python的-S选项在文档中定义为“禁用模块站点的导入及其所需的sys.path的站点依赖性操作”。我发现,当我使用此选项时,在我的机器上启动python的速度是这个选项的两倍多,有时甚至更多。例如,在一台(慢速)机器上:


这是5.3倍的加速。而且它似乎工作得很好,至少在我尝试过的脚本中是这样。使用它的缺点是什么?

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

python -Sc "import numpy"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named numpy
python-Sc“导入numpy”
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:没有名为numpy的模块
您可以自己查看
site.py
来了解它在做什么。它只是常规库目录中的一个模块。至少在我的系统上,它看起来有四个主要功能:

  • 设置站点包路径
  • 设置默认编码
  • 定义一些交互式使用的帮助函数(
    quit
    help
  • 设置用户特定的站点自定义

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

执行此操作时,您将丢失大量模块搜索路径:

$ 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别名)。

-S
标志执行以下操作:

不要在初始化时暗示“导入站点”

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

以文档为指导,
-S
标志将导致:

  • 未将其他模块添加到
    sys.path
    。您可以通过启动
    python
    python-S
    并在
    import sys中执行以下操作来比较差异;打印系统路径
    。许多模块将不可用,因此您将无法导入它们
  • 自定义站点初始化代码将不会运行(这可以在名为
    sitecustomize
    的模块中定义)
  • 自定义初始化代码将不会运行(这可以在名为
    usercustomize
    的模块中定义)
对您的问题的简短回答是:是的,它使Python启动更快,但许多模块和定制代码将不可用或不可能


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

这一切都回避了一个问题:为什么网站包中需要这么多东西?我很确定大部分时间都没必要。但出于某些原因,传统做法是将可能只使用一次的代码放入站点包中。在我看来,最好将多个应用程序不共享的内容放在/usr/local或其他文件的唯一目录下,因为模块应该放在这个目录下。通常,如果您安装了一些第三方库,它会进入python站点包目录。他们还应该去哪里?如果你指的是你自己为特定项目创建的模块,那么是的,不把它们放在站点包中是很好的。但当您安装第三方库时,它通常应该放在站点软件包中,因为如果您安装了某个库,这可能意味着您要将其用于其他用途。在我的站点软件包目录中,我看到了许多通用库,如numpy、scipy、matplotlib、gtk、pygame、PyParasting dabo——许多Python程序可能需要使用这些库。嗯,听起来好像我的程序只使用英语(即lazy),并且只依赖于基本的标准Python模块,不设置默认编码可能会导致较少的问题(使用.lower()和诸如此类的方法会减少意外事件)。所以,当我编写一些基本脚本时,这可能没什么问题,但启动时间很重要。
$ 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