代码之家  ›  专栏  ›  技术社区  ›  Jason Baker

路径有什么用?

  •  51
  • Jason Baker  · 技术社区  · 14 年前

    我从来没有注意到 __path__ 在今天之前在我的一些包上定义的属性。根据文件:

    软件包支持一个更特殊的 属性, __路径__ 初始化为包含 保存文件的目录的名称 __init__.py 在代码之前 在该文件中执行。这个 影响以后对模块的搜索 以及包装中的子包装 包裹。

    如果需要,它可以用来扩展

    有人能给我解释一下这到底是什么意思,为什么我要用它吗?

    4 回复  |  直到 14 年前
        1
  •  45
  •   Ian Bicking    14 年前

    pkgutil 把包裹放在磁盘上。例如,zope.interface和zope.schema是独立的发行版( zope /usr/lib/python2.6/site-packages/zope/interface/ ,而您在中更本地地使用zope.schema /home/me/src/myproject/lib/python2.6/site-packages/zope/schema

    如果你把 pkgutil.extend_path(__path__, __name__) 在里面 /usr/lib/python2.6/site-packages/zope/__init__.py 那么zope.interface和zope.schema都将是可导入的,因为pkgutil将发生更改 __path__ ['/usr/lib/python2.6/site-packages/zope', '/home/me/src/myproject/lib/python2.6/site-packages/zope'] .

    pkg_resources.declare_namespace pkgutil.extend_path

    手动更改 虽然在调试命名空间包的导入问题时查看变量很有用,但这种情况并不常见,也可能不是必需的。

    你也可以使用 __路径__ 例如,对于monkeypatching,我有时会通过创建一个文件来创建monkeypatching distutils distutils/__init__.py sys.path :

    import os
    stdlib_dir = os.path.dirname(os.__file__)
    real_distutils_path = os.path.join(stdlib_dir, 'distutils')
    __path__.append(real_distutils_path)
    execfile(os.path.join(real_distutils_path, '__init__.py'))
    # and then apply some monkeypatching here...
    
        2
  •  34
  •   Syntactic    14 年前

    __path__ ,您可以强制解释器在不同的目录中查找属于该包的模块。

        3
  •  7
  •   codeforester    6 年前

    除了根据运行时条件选择不同版本的模块外 Syntactic 也就是说,此功能还允许您将包分解为多个部分/下载/安装,同时保持单个逻辑包的外观。

    考虑下面的问题。

    • 我有两个包裹, mypkg _mypkg_foo
    • 我的包裹 , foo.py .
    • 下载和安装时, 我的包裹 foo.py公司 .

    __init__.py

    try:
        import _mypkg_foo
        __path__.append(os.path.abspath(os.path.dirname(_mypkg_foo.__file__)))
        import mypkg.foo
    except ImportError:
        pass
    

    _mypkgèu foo公司 ,那么 mypkg.foo 对他们来说是可用的。如果他们没有,它就不存在。

        4
  •  3
  •   Graham Klyne    10 年前

    我遇到的一种特殊情况是,当一个包变得足够大时,我想将它的一部分拆分成子目录,而不必更改引用它的任何代码。

    views 它收集了许多支持实用程序的函数,这些函数与包的主要顶级用途混淆了。我能够将这些支持函数移到一个子目录中 utils __init__.py 意见

    __path__.append(os.path.join(os.path.dirname(__file__), "utils"))
    

    views/__init_.py ,我可以用新的文件结构运行软件的其余部分,而不需要对文件做任何进一步的更改。

    )我也试着做类似的事情 import 报告中的声明 views/__init__.py 但子包模块仍然无法通过导入 view

    (此响应基于python2.7安装)