hello world太简单,看不出语法,写个长点的,也算对python的语法有大概的了解了,哈哈哈。
功能:root是找到没有被包含的头文件,allh是看一个源文件都包含了哪些头文件。
没啥用,当练手。
#!/usr/bin/python
#python code practice for include discovery
import os
pre = "#include"
def compact(str):
#local variable assignment before referenced
l = len(str)
i = 0
res = ""
while i < l:
if str[i] != ' ' and str[i] != '\n':
res += str[i]
i = i + 1
return res
def geth_in_str(str):
res = set() #init set
l0 = len(str)
l1 = len(pre)
i = 0
while i + l1 + 2 <= l0:
c = 'x'
if str[i + l1] == '"':
c = '"'
elif str[i + l1] == '<':
c = '>'
else:
i = i + 1
continue
if str[i : i + l1] == pre:
#substr[i, i + l1)
j = i + l1 + 1
while j < l0:
if str[j] == c:
res.add(str[i + l1 + 1 : j])
break
j = j + 1
if j < l0:
i = j
i = i + 1
return res
def geth_in_file(fn):
fd = open(fn, "r")
text = fd.read()
text = compact(text)
res = geth_in_str(text)
fd.close()
return res
def print_hset(hs):
for e in hs:
print e
def hroot(dn):
all = set()
ex_all = set()
tp = os.walk(dn).next()
#to generates tuples (parent, dirnames, filenames),
#and .next() to get the first
for file in tp[2]:
l = len(file)
if l > 1 and file[l - 1] == 'h' and file[l - 2] == '.':
all.add(file)
ex_all = ex_all | geth_in_file(file)
#set operation
print ex_all
res = all - ex_all
return res
def main():
print "h helper begin...."
while True:
cmd = raw_input("input cmd:\n")
#raw_input a string, and input a int or float
if cmd == "q" or cmd == "quit":
break
if cmd == "root":
#show .hs in the dir of which is not included
dn = raw_input("input dir:\n")
print
res = hroot(dn)
print_hset(res)
elif cmd == "allh":
#show .hs included by the file
fn = raw_input("input file:\n")
print
res = geth_in_file(fn)
print_hset(res)
print
if __name__ == "__main__":
main()
#include <C.h>
root@152.41 hnet>cat B.h
#include <iostream>
root@152.41 hnet>cat C.h
#include "sys/haha.h"
root@152.41 hnet>./h.py
h helper begin....
input cmd:
root
input dir:
./
root@152.41 hnet>cat B.h
#include <iostream>
root@152.41 hnet>cat C.h
#include "sys/haha.h"
root@152.41 hnet>./h.py
h helper begin....
input cmd:
root
input dir:
./
set(['B.h', 'iostream', 'C.h', 'sys/haha.h'])
A.h
A.h
input cmd:
allh
input file:
A.h
allh
input file:
A.h
B.h
C.h
C.h
input cmd:
allh
input file:
B.h
allh
input file:
B.h
iostream
input cmd:
allh
input file:
C.h
allh
input file:
C.h
sys/haha.h
补充:如果文件open太多,漏了close,程序会死掉的。
root@152.41 test>ulimit -a core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 210944 max locked memory (kbytes, -l) 32 max memory size (kbytes, -m) unlimited open files (-n) 65535 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 131072 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
这里可以看到最多可以打开65535个file。
可以用ulimit -n xxx进行修改。这个没啥好改的,栈大小可以改改。