【问题标题】:How are Python modules (which are shared libraries) imported without a .py file?如何在没有 .py 文件的情况下导入 Python 模块(它们是共享库)?
【发布时间】:2015-08-18 17:17:57
【问题描述】:

我正在运行一个交互式 Python shell 并尝试使用“检查”模块查看导入模块的路径。我尝试导入的模块具有使用 SWIG 围绕 C++ API 的 Python 包装器。

下面的 sn-p 显示了我的步骤:

>>> import os
>>> import inspect
>>>      
>>> import db
>>> inspect.getfile(db)
'mypath1/lib/db/db.pyc'
>>>
>>> import dart
>>> inspect.getfile(dart)
'mypath2/lib/dart.so'
>>>

我的PYTHONPATH 包含mypath1/lib/dbmypath2/lib

我的印象是,为了能够加载模块,解释器需要访问.py 文件,然后调用imp.load_module 来加载所需的共享库(.so 文件)。这是我在db 模块的情况下看到的,该模块在mypath1/lib/db 下有一个db.py 文件。但是,dartmypath2/lib 下没有.py 文件。

是否可以像 dart 模块那样导入没有 .py 文件的模块?

【问题讨论】:

    标签: python-2.7 python-import


    【解决方案1】:

    Python 为任何给定的import 搜索多个不同的文件,包括该名称的目录并包含一个 __init__.py、一个用于纯原生 Python 模块的 .so 文件和 .pyc 文件,即使.py 被删除。

    运行strace -o trace_output.txt python 看看它是如何工作的。 import md5 的部分示例:

    stat("/usr/lib/python2.7/md5", 0x7fff81ff16d0) = -1 ENOENT (No such file or directory)
    open("/usr/lib/python2.7/md5.x86_64-linux-gnu.so", O_RDONLY) = -1 ENOENT (No such file or directory)
    open("/usr/lib/python2.7/md5.so", O_RDONLY) = -1 ENOENT (No such file or directory)
    open("/usr/lib/python2.7/md5module.so", O_RDONLY) = -1 ENOENT (No such file or directory)
    open("/usr/lib/python2.7/md5.py", O_RDONLY) = 3
    

    在我的设置中,它实际上搜索:

    • ~/.local/lib/python2.7/
    • /usr/local/lib/python2.7/dist-packages
    • /usr/lib/python2.7/dist-packages
    • /usr/lib/python2.7/

    在每个目录中,遵循调用stat查找目录然后查找.so文件,然后.py的模式。

    有关编写纯原生 python 模块的更多信息,请参阅此处:https://docs.python.org/2/extending/index.html

    【讨论】:

      猜你喜欢
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 2021-04-22
      • 2018-09-21
      相关资源
      最近更新 更多