• Python.Module.site


    site

    " This module is automatically imported during initialization. The automatic import

    can be suppressed using the interpreter’s -S option.

    Importing this module will append site-specific paths to the module search path and add a few builtins. " Ref[1]

    1. Import Path 

    import path 参考Ref[5]。

    在解释器(interpreter)启动时,site会被自动的导入(imported)。在导入时,site扩展sys.path。

    扩展的方式是使用sys.prefix 和 sys.exec_prefix。site.py中PREFIXES的定义如下,Ref[3]:

    1 # Prefixes for site-packages; add additional prefixes like /usr/local here
    2 PREFIXES = [sys.prefix, sys.exec_prefix]

    Q: 那么sys.prefix sys.exec_prefix 和 sys.path 的含义分别是什么呢? 

    Ref[4]

    Demo-1: 查看site.PREFIXES

     1 import sys
     2 import os
     3 import platform
     4 import site
     5 
     6 if 'Windows' in platform.platform():
     7     SUFFIXES = [
     8         '',
     9         'lib/site-packages',
    10         ]
    11 else:
    12     SUFFIXES = [
    13         'lib/python%s/site-packages' % sys.version[:3],
    14         'lib/site-python',
    15         ]
    16 
    17 print 'Path prefixes:'
    18 for p in site.PREFIXES:
    19     print '  ', p
    20 
    21 for prefix in sorted(set(site.PREFIXES)):
    22     print
    23     for suffix in SUFFIXES:
    24         path = os.path.join(prefix, suffix).rstrip(os.sep)
    25         print path
    26         print '   exists:', os.path.exists(path)
    27         print '  in path:', path in sys.path

    2. User Directories (用户目录)

    http://pymotw.com/2/site/

    2.1 USER_BASE 和 USER_SITE

    "In addition to the global site-packages paths, site is responsible for adding the

    user-specific locations to the import path." Ref[2]

    Q: globale site-package 和 import path分别是什么? 

    user-specific path是基于USER_BASE的。在USER_BASE中的是site-packages directory,该directory的路径是

    USER_SITE

    "The user-specific paths are all based on the USER_BASE directory, which usually

    located in a part of the filesystem owned (and writable) by the current user."

    A):

    Demo-2: 查看 USER_BASE USER_SITE

    1 import site
    2 
    3 print 'Base:', site.USER_BASE
    4 print 'Site:', site.USER_SITE

    输出是:

    "

    Base: /Users/XiaoKL/Library/Python/2.7

    Site: /Users/XiaoKL/Library/Python/2.7/lib/python/site-packages

    "

    USER_BASE可以由环境变量PYTHONUSERBASE来设置。

    B): 命令查看USER_BASE USER_SITE:

    $ python -m site --user-base

    $ python -m site --user-site

    $ PYTHONUSERBASE=/tmp/$USER python -m site --user-base

    $ PYTHONUSERBASE=/tmp/$USER python -m site --user-site

    python的-m module-name:

           "-m module-name

                  Searches  sys.path for the named module and runs the correspond-

                  ing .py file as a script. " Ref[man python2.7]

    2.2 Disable user directory

    The user directory can also be explicitly disabled on the command line with -s.

    $ python -s site_enable_user_site.py

    3. Path Configuration Files (路径配置文件)

    在路径被添加到import path的过程中,path configuration file被扫描解析。

    A path configuration file is a plain text file with the extension .pth

    每一行可以是:

    1. A full or relative path to another location that should be added to the import path.
    2. A Python statement to be executed. All such lines must begin with an import statement.
    3. Blank lines are ignored.
    4. A line starting with # is treated as a comment and ignored.

    路径配置文件的作用:

    "Path configuration files can be used to extend the import path to look in locations that

    would not have been added automatically. "  Ref[2]

    Demo-3: 没有使用路径配置文件的Case

    创建一个目录with_modules。

    $(ROOT_DIR)

    |-- site_addsitedir.py

    |--with_modules 

        |--mymodule.py 

    site_addsitedir.py: site_addsitedir.py

    mymodule.py: mymodule.py

    $ python site_addsitedir.py  with_modules

     

    "If the directory given to addsitedir() includes any files matching the pattern *.pth,

    they are loaded as path configuration files." Ref[2]

    Demo-4: 使用路径配置文件的Case

    $(ROOT_DIR)

    |-- site_addsitedir.py

    |--with_modules 

        |--pymotw.pth

        |--subdir

            |--mymodule.py

    pymotw.pth的内容是:  

    1 # Add a single subdirectory to the path.
    2 ./subdir

    运行 "$ python site_addsitedir.py  with_modules" 的输出如下:

    __file__: site_addsitedir.py
    cwd: /Users/XiaoKL/Projects/PrivateProject/PythonProject/site
    basename: site_addsitedir.py
    abspath: /Users/XiaoKL/Projects/PrivateProject/PythonProject/site/site_addsitedir.py
    script_directory: /Users/XiaoKL/Projects/PrivateProject/PythonProject/site
    module_directory: with_modules
    Could not import mymodule: No module named mymodule
    ------------
    New paths:
       /Users/XiaoKL/Projects/PrivateProject/PythonProject/site/with_modules
       /Users/XiaoKL/Projects/PrivateProject/PythonProject/site/with_modules/subdir
    -------------
    Loaded mymodule from with_modules/subdir/mymodule.py

    4. sitecustomize

    "The site module is also responsible for loading site-wide customization defined by the local

    site owner in a sitecustomize module.

    Uses for sitecustomize include extending the import path and enabling coverage, profiling, or

    other development tools."  Ref[2]

    Demo-5: sitecustomize的使用

    创建 sitecustomize.py 如下:

     1 print 'Loading sitecustomize.py'
     2 
     3 import site
     4 import platform
     5 import os
     6 import sys
     7 
     8 path = os.path.join('/opt', 'python', sys.version[:3], platform.platform())
     9 print 'Adding new path', path
    10                     
    11 site.addsitedir(path)

    创建 site_sitecustomize.py 如下:

    1 import sys
    2 
    3 print 'Running main program'
    4 
    5 print 'End of path:', sys.path[-1]

    将脚本 sitecustomize.py 和 site_sitecustomize.py 都放在with_sitecustomize目录中:

    with_sitecustomize/

      |--sitecustomize.py

      |--site_sitecustomize.py

    然后执行如下命令:

    1 $ PYTHONPATH=with_sitecustomize python with_sitecustomize/site_sitecustomize.py

    输出如下:

    Loading sitecustomize.py
    Adding new path /opt/python/2.7/Darwin-13.4.0-x86_64-i386-64bit
    Running main program
    End of path: /opt/python/2.7/Darwin-13.4.0-x86_64-i386-64bit

      

    "Since sitecustomize.py is meant for system-wide configuration, it should be installed somewere

    in the default path (usally in the site-packages directory). This example sets PYTHONPATH explicitly

    to ensure the module is picked up."  Ref[2]

    Q: PYTHONPATH 是个什么东西? 

    "The import search path list can be modified before starting the interpreter by setting

    the shell variable PYTHONPATH to a colon-separated list of directories."

    5. usercustomize 

    "Similar to sitecustomize, the usercustomize module can be used to set up user-specific settings

    each time the interpreter starts up. usercustomize is loaded after sitecustomize, so site-wide

    customizations can be overridden."  Ref[2]

    "When the user site directory feature is disabled, usercustomize is not imported" Ref[2]

    6. Disabling site

    -S: Disable the import of the module  site  and  the  site-dependent  manipulations  of sys.path that it entails.

    $ python -S site_import_path.py

     


    Reference

    1. site — Site-specific configuration hook

    https://docs.python.org/2/library/site.html

    2. site

    http://pymotw.com/2/site/

    3. site.py source code

    https://hg.python.org/cpython/file/2.7/Lib/site.py

    4. sys-prefix  & sys-exec_prefix

    http://pymotw.com/2/sys/interpreter.html#sys-prefix

    5. import path

    https://pymotw.com/2/sys/imports.html#import-path 


    TODO

    Running code at Python startup

    Modules and Imports

    setuptools

  • 相关阅读:
    C#如何连接wifi和指定IP
    3.4 小结
    3.3.4.5 起始与清除
    3.3.4.4 打印行
    3.3.4.3 设置字段分隔字符
    3.3.4.2 字段
    3.3.4.1 模式与操作
    3.3.4 使用 awk 重新编排字段
    3.3.3 使用 join 连接字段
    3.3.2 使用 cut 选定字段
  • 原文地址:https://www.cnblogs.com/cwgk/p/4564557.html
Copyright © 2020-2023  润新知