小编emp*_*ice的帖子

当从不调用issubclass()时,Python会在issubclass()上抛出TypeError

我有一段代码可以在大多数时间内完美运行,但每隔一段时间我就会在traceback中得到这个错误:

File "/path/to/somefile.py", line 272, in somefile
    sm = -0.5 * (wv[0]**2. / sm2 + numpy.log(2. * numpy.pi * sm2))
TypeError: issubclass() arg 2 must be a class or tuple of classes
Run Code Online (Sandbox Code Playgroud)

我知道什么issubclass()做并理解错误,但我从来没有打过它; 代码中的那一行是纯算术,所以我不知道为什么这首先TypeError是提出来的.我唯一的理论是Numpy在幕后调用它,但是追溯应该显示Numpy源中有问题的一行,对吧?这是怎么回事?

更新:

wv是一个浮点数组,sm2是一个浮点数.该错误实际上是由numpy.log(新)行引发的

tmp = numpy.log(2. * numpy.pi * sm2)
Run Code Online (Sandbox Code Playgroud)

但是,错误消息中不再提供更多信息.

更多更新:

我当前的Numpy版本(来自Python提示):

>>> import numpy
>>> numpy.__version__
'1.6.2'
Run Code Online (Sandbox Code Playgroud)

我将问题行更改为

try:
    tmp = numpy.log(2. * numpy.pi * sm2)
except TypeError:
    print type(sm2), 2. * numpy.pi * sm2
Run Code Online (Sandbox Code Playgroud)

得到了输出 …

python numpy python-2.7

9
推荐指数
1
解决办法
1031
查看次数

从内核模块更改用户空间内存保护标志

我正在编写一个可以访问特定进程内存的内核模块.我在一些用户空间内存上做了一个匿名映射do_mmap():

#define MAP_FLAGS   (MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS)

prot = PROT_WRITE;
retval = do_mmap(NULL, vaddr, vsize, prot, MAP_FLAGS, 0);
Run Code Online (Sandbox Code Playgroud)

vaddr并且vsize先前设置,并且呼叫成功.在我从内核模块(via copy_to_user)写入该内存块后,我想删除PROT_WRITE它的权限(就像我mprotect在普通用户空间中所做的那样).我似乎无法找到允许这样做的功能.

我试图取消映射该区域并使用正确的保护重新映射它,但是这会将内存块清零,删除我刚刚编写的所有数据; 设置MAP_UNINITIALIZED可能会修复,但是,从手册页:

MAP_UNINITIALIZED(自Linux 2.6.33起)

不要清除匿名页面.此标志旨在提高嵌入式设备的性能.仅当使用CONFIG_MMAP_ALLOW_UNINITIALIZED选项配置内核时,才会使用此标志.由于安全隐患,该选项通常仅在嵌入式设备(即,完全控制用户存储器内容的设备)上启用.

所以,虽然这可能会做我想要的,但它不会很便携.有没有一种标准的方法来完成我的建议?

memory-management mmap process linux-kernel

5
推荐指数
1
解决办法
2037
查看次数

matplotlib图例标签与LaTeX数学的垂直对齐

将具有下标的标签与没有它们的标签混合时,它们不会在图例中垂直对齐.由于matplotlib在内部根据打印字符确定边界框,因此使用vphantom字符不能对齐这些图例标签,我也没有运气改变标签的垂直对齐方式set_va.

下面是一个MWE,它说明了我试图解决的问题.我希望标签尽可能与文本基线对齐,否则与文本顶部对齐.

import numpy as np
import matplotlib as mpl
mpl.rcParams['text.usetex'] = True
import matplotlib.pyplot as plt

x = np.arange(10)
plt.plot(x, np.random.uniform(size=(10,)), c='red', label=r'test')
plt.scatter(x, np.random.uniform(size=(10,)), c='blue', label=r'test${}_{xy}$')
plt.legend(ncol=2)                                                                          
plt.show()
Run Code Online (Sandbox Code Playgroud)

mwe图像

python latex matplotlib

4
推荐指数
1
解决办法
2341
查看次数

将ELF共享库和自定义binfmt可执行文件加载到相同的Linux地址空间中

我正在开发一个项目来加载和运行Linux平台上的自定义二进制格式可执行文件(在我的例子中是PE).到目前为止,我已经成功地完成了这项工作,首先加载可执行文件,然后加载一个调用可执行文件起始地址然后安全退出的小型ELF共享库.

不过,出于某些原因,我真的不想自己装ELF.首先,我使用的共享库是用汇编编写的(我不能使用任何其他东西,因为我没有链接libc等等),这将是非常特定于平台的,我想放弃它和使用C所以我可以编译任何平台.此外,使用Linux的本机ELF加载程序而不是我自己的简化版本将更容易,更安全.

我想知道是否有办法使用我的binfmt处理程序,一个已安装的内核模块来加载我的可执行文件,然后让Linux将我的共享库(及其依赖项)加载到同一地址空间而不覆盖我的可执行代码.我首先想到uselib系统调用可能有用,但是手册页上的描述不清楚这是否符合我的目的:

从libc 4.4.4开始,只加载了库"/lib/ld.so",这样这个动态库就可以加载所需的剩余库(再次使用这个调用).这也是libc5中的事态.

glibc2不使用此调用.

我也从未见过它的使用示例,我总是担心使用我不理解的系统调用.

有没有一个很好的方法来实现我所描述的?我是否可以使用Linux的现有功能将共享库(用C编写)加载到已包含可执行代码的地址空间中,如果是这样,我如何使用该库而不知道它已被加载到何处?

linux memory-management process shared-libraries elf

3
推荐指数
1
解决办法
2247
查看次数