我正在运行一个交互式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
文件)。这就是我在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
//...
//...
}
模块一样?
答案 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