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

时间:2015-08-18 17:17:58

标签: python-2.7 python-import

我正在运行一个交互式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文件)。这就是我在db模块中看到的db.py文件mypath1/lib/db下的dart文件。但是,.py mypath2/lib下没有dart个文件。

是否可以导入没有.py文件的模块,就像//parent @Entity @Table(name = "MEMBER") public class Member implements Serializable { @Id @GeneratedValue @Column(name = "MEMBER_ID") private int memberId; @Column(name = "USERNAME") private String username; @Column(name = "PASSWORD") private String password; @OneToMany(mappedBy = "member", cascade = CascadeType.ALL) private List<Role> roleList; //getters setters //... //... } 模块一样?

1 个答案:

答案 0 :(得分:7)

Python为任何给定的import搜索几个不同的文件,包括一个名称相同的目录,包含一个__init__.py,一个.so文件,用于纯本机Python模块和{{1}即使.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

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