我想知道为什么在导入包时,python包中包含子模块的目录(子包)会显示为符号.例如,如果我有这个包:
PyModTest/ Top-level package
__init__.py Initialize the package
Source/ Subpackage holding source files
__init__.py
WildMod.py Submodule containing a function: 'WildFunc'
Run Code Online (Sandbox Code Playgroud)
顶级__init__.py看起来像这样:
#!/usr/bin/env python
from Source.WildMod import WildFunc
Run Code Online (Sandbox Code Playgroud)
并且,为了完整起见,下级__init__.py看起来像这样:
#!/usr/bin/env python
__all__ = ["WildMod"]
Run Code Online (Sandbox Code Playgroud)
好的,现在我打开解释器,导入模块,然后查看符号:
>>> import PyModTest
>>> dir(PyModTest)
['Source', 'WildFunc', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
Run Code Online (Sandbox Code Playgroud)
看,"源"模块出现了,即使我从未专门导入它!
我想看到的唯一符号(除了私有符号)是我的'WildFunc'.有没有办法隐藏'Source'包?
所以我在32位Linux机器上从ctypes获得了一个段错误,我无法在64位darwin或linux上重现.
这是C:
typedef struct {
void *ptr;
} doodle;
doodle C_intpointerfunction(int *a)
{
*a = 41;
doodle foo;
foo.ptr = a;
return foo;
}
Run Code Online (Sandbox Code Playgroud)
编译时使用:
gcc -c intpointerlibrary.c
gcc -shared intpointerlibrary.o -o libintpointerlib.so
Run Code Online (Sandbox Code Playgroud)
这是Python:
import numpy as N
from ctypes import *
_libintpointer = N.ctypeslib.load_library('libintpointerlib.so','.')
_libintpointer.C_intpointerfunction.restype = c_void_p
_libintpointer.C_intpointerfunction.argtypes = [POINTER(c_int)]
def P_intpointerfunction():
lrc = c_int(0)
print "lrc before (should be 0) = "+str(lrc.value)
return_val = _libintpointer.C_intpointerfunction(byref(lrc))
print "lrc after (should be 41) = "+str(lrc.value)
return return_val
Run Code Online (Sandbox Code Playgroud)
所以现在,当我调用这个函数时:
rc = …Run Code Online (Sandbox Code Playgroud)