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/db
和mypath2/lib
。
我的印象是,为了能够加载模块,解释器需要访问一个.py
文件,然后调用imp.load_module
来加载所需的共享库( .so
文件)。 这就是我在mypath1/lib/db
下具有db.py
文件的db
模块的情况。 但是, dart
在mypath2/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?