在尝试从python中找出ping(ICMP)的最佳方法时,我遇到了以下问题:
答案通常归结为"使用具有root权限的第三方模块"或"使用系统的ping命令并解析输出".在本机方法中,icmplib和M. Cowles以及J. Diemer的ping.py明确提到了root权限的需要,scapy 手册也是如此.
所以从那个方面来看,原本发送没有特权的ICMP ping似乎是不可能的.系统ping命令确实以某种方式进行管理,但其手册页并未阐明如何操作.另一方面,icmp的手册页似乎表明它是可能的:
Non-privileged ICMP
ICMP sockets can be opened with the SOCK_DGRAM socket type without
requiring root privileges. The synopsis is the following:
socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP)
Datagram oriented ICMP sockets offer a subset of the functionality avail-
able to raw ICMP sockets. Only IMCP request messages of the following
types can be sent: ICMP_ECHO, ICMP_TSTAMP or ICMP_MASKREQ.
所以看起来,至少根据icmp,它是允许的.那么为什么所有的python工具都无法做到这一点呢?python工具是否过于笼统,并期望特权套接字上的任何工作都具有特权?是否有可能在C中编写ping函数,可以在没有root权限的情况下ping,并用此扩展python?有没有人这样做过?我只是误解了这个问题吗?
当作为I386/x86_64的通用二进制编译,而在我的64位10.6.2 MacPro1,1执行我不能得到SciPy的32位模式下运行.
在这个答案的帮助下,我构建了一个32/64位的python 2.6.4的intel通用二进制文件,目的是使用arch命令在架构之间进行选择.(我设法使用lipo制作了一些我想要的库的通用二进制文件.)一切正常.然后我根据hyperjeff的文章中的说明安装了scipy ,只是使用了更新的numpy(1.4.0)并且在安装scipy时跳过了关于简单地移动numpy的一点.
现在,除了scipy之外的所有东西似乎都可以正常工作,我确实可以使用arch -i386 python和选择32位和64位模式arch -x86_64 python.
Scipy以32位模式抱怨:
$ arch -x86_64 python -c "import scipy.interpolate; print 'success'"
success
$ arch -i386 python -c "import scipy.interpolate; print 'success'"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/interpolate/__init__.py", line 7, in <module>
from interpolate import *
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/interpolate/interpolate.py", line 13, in <module>
import scipy.special as spec
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/__init__.py", line 8, in <module>
from …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚哪些整数python只实例化一次(看起来是-6到256),并且在这个过程中偶然发现了一些字符串行为,我无法看到模式.有时,以不同方式创建的相等字符串共享相同的字符串id,有时不是.这段代码:
A = "10000"
B = "10000"
C = "100" + "00"
D = "%i"%10000
E = str(10000)
F = str(10000)
G = str(100) + "00"
H = "0".join(("10","00"))
for obj in (A,B,C,D,E,F,G,H):
print obj, id(obj), obj is A
Run Code Online (Sandbox Code Playgroud)
打印:
10000 4959776 True 10000 4959776 True 10000 4959776 True 10000 4959776 True 10000 4959456 False 10000 4959488 False 10000 4959520 False 10000 4959680 False
我甚至没有看到模式 - 除了前四个没有显式函数调用的事实 - 但肯定不会是它,因为+例如C中的" "意味着要添加的函数调用.我特别不明白为什么C和G是不同的,因为这意味着加法的组成部分的ID比结果更重要.
那么,AD经历的特殊待遇是什么,使它们成为同一个例子?
我想在matplotlib的方形绘图区域绘制一个对数y轴和一个线性x轴的图.我可以在正方形上绘制线性线性图和对数图,但是我使用的方法Axes.set_aspect(...)并没有用于对数线性图.有一个很好的解决方法吗?
正方形上的线性线性图:
from pylab import *
x = linspace(1,10,1000)
y = sin(x)**2+0.5
plot (x,y)
ax = gca()
data_aspect = ax.get_data_ratio()
ax.set_aspect(1./data_aspect)
show()
Run Code Online (Sandbox Code Playgroud)

广场上的对数图:
from pylab import *
x = linspace(1,10,1000)
y = sin(x)**2+0.5
plot (x,y)
ax = gca()
ax.set_yscale("log")
ax.set_xscale("log")
xmin,xmax = ax.get_xbound()
ymin,ymax = ax.get_ybound()
data_aspect = (log(ymax)-log(ymin))/(log(xmax)-log(xmin))
ax.set_aspect(1./data_aspect)
show()
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用对数线性图时,我没有得到方形区域,而是一个警告
from pylab import *
x = linspace(1,10,1000)
y = sin(x)**2+0.5
plot (x,y)
ax = gca()
ax.set_yscale("log")
xmin,xmax = ax.get_xbound()
ymin,ymax = ax.get_ybound()
data_aspect = (log(ymax)-log(ymin))/(xmax-xmin)
ax.set_aspect(1./data_aspect) …Run Code Online (Sandbox Code Playgroud) python ×4
architecture ×1
icmp ×1
instance ×1
logarithm ×1
matplotlib ×1
ping ×1
scipy ×1
string ×1