Python模块(它是共享库)如何在没有.py文件的情况下导入?

我正在运行一个交互式Python shell,并尝试使用'inspect'模块查看从哪个路径导入模块。 我试图导入的模块使用SWIG在C ++ API周围有Python包装器。

以下片段显示了我的步骤:

>>> 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文件)。 这就是我在mypath1/lib/db下具有db.py文件的db模块的情况。 但是, dartmypath2/lib下没有.py文件。

是否有可能在dart模块的情况下导入没有.py文件的模块?


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

    链接地址: http://www.djcxy.com/p/28403.html

    上一篇: How are Python modules (which are shared libraries) imported without a .py file?

    下一篇: How does ASP.NET 5 inject startup's dependencies?