/
usr
/
lib64
/
python2.7
/
/usr/lib64/python2.7
mkdir
upload
Name
Size
Mode
Actions
bsddb/
-
0755
rm
compiler/
-
0755
rm
config/
-
0755
rm
ctypes/
-
0755
rm
curses/
-
0755
rm
distutils/
-
0755
rm
email/
-
0755
rm
encodings/
-
0755
rm
ensurepip/
-
0755
rm
hotshot/
-
0755
rm
idlelib/
-
0755
rm
importlib/
-
0755
rm
json/
-
0755
rm
lib-dynload/
-
0755
rm
lib2to3/
-
0755
rm
logging/
-
0755
rm
multiprocessing/
-
0755
rm
plat-linux2/
-
0755
rm
pydoc_data/
-
0755
rm
site-packages/
-
0755
rm
sqlite3/
-
0755
rm
test/
-
0755
rm
unittest/
-
0755
rm
wsgiref/
-
0755
rm
xml/
-
0755
rm
abc.py
7145
0644
edit
dl
rm
abc.pyc
6143
0644
edit
dl
rm
abc.pyo
6087
0644
edit
dl
rm
aifc.py
34579
0644
edit
dl
rm
aifc.pyc
30459
0644
edit
dl
rm
aifc.pyo
30459
0644
edit
dl
rm
antigravity.py
60
0644
edit
dl
rm
antigravity.pyc
203
0644
edit
dl
rm
antigravity.pyo
203
0644
edit
dl
rm
anydbm.py
2663
0644
edit
dl
rm
anydbm.pyc
2800
0644
edit
dl
rm
anydbm.pyo
2800
0644
edit
dl
rm
argparse.py
89228
0644
edit
dl
rm
argparse.pyc
64367
0644
edit
dl
rm
argparse.pyo
64202
0644
edit
dl
rm
ast.py
11805
0644
edit
dl
rm
ast.pyc
12938
0644
edit
dl
rm
ast.pyo
12938
0644
edit
dl
rm
asynchat.py
11581
0644
edit
dl
rm
asynchat.pyc
8810
0644
edit
dl
rm
asynchat.pyo
8810
0644
edit
dl
rm
asyncore.py
20943
0644
edit
dl
rm
asyncore.pyc
18893
0644
edit
dl
rm
asyncore.pyo
18893
0644
edit
dl
rm
atexit.py
1705
0644
edit
dl
rm
atexit.pyc
2203
0644
edit
dl
rm
atexit.pyo
2203
0644
edit
dl
rm
audiodev.py
7597
0644
edit
dl
rm
audiodev.pyc
8469
0644
edit
dl
rm
audiodev.pyo
8469
0644
edit
dl
rm
base64.py
11806
0755
edit
dl
rm
base64.pyc
11297
0644
edit
dl
rm
base64.pyo
11297
0644
edit
dl
rm
BaseHTTPServer.py
22747
0644
edit
dl
rm
BaseHTTPServer.pyc
21722
0644
edit
dl
rm
BaseHTTPServer.pyo
21722
0644
edit
dl
rm
Bastion.py
5744
0644
edit
dl
rm
Bastion.pyc
6660
0644
edit
dl
rm
Bastion.pyo
6660
0644
edit
dl
rm
bdb.py
21714
0644
edit
dl
rm
bdb.pyc
19101
0644
edit
dl
rm
bdb.pyo
19101
0644
edit
dl
rm
binhex.py
14698
0644
edit
dl
rm
binhex.pyc
15460
0644
edit
dl
rm
binhex.pyo
15460
0644
edit
dl
rm
bisect.py
2595
0644
edit
dl
rm
bisect.pyc
3071
0644
edit
dl
rm
bisect.pyo
3071
0644
edit
dl
rm
calendar.py
23384
0644
edit
dl
rm
calendar.pyc
27913
0644
edit
dl
rm
calendar.pyo
27913
0644
edit
dl
rm
cgi.py
36308
0755
edit
dl
rm
cgi.pyc
33366
0644
edit
dl
rm
cgi.pyo
33366
0644
edit
dl
rm
CGIHTTPServer.py
13089
0644
edit
dl
rm
CGIHTTPServer.pyc
11018
0644
edit
dl
rm
CGIHTTPServer.pyo
11018
0644
edit
dl
rm
cgitb.py
12175
0644
edit
dl
rm
cgitb.pyc
12138
0644
edit
dl
rm
cgitb.pyo
12138
0644
edit
dl
rm
chunk.py
5419
0644
edit
dl
rm
chunk.pyc
5602
0644
edit
dl
rm
chunk.pyo
5602
0644
edit
dl
rm
cmd.py
15026
0644
edit
dl
rm
cmd.pyc
14039
0644
edit
dl
rm
cmd.pyo
14039
0644
edit
dl
rm
code.py
10189
0644
edit
dl
rm
code.pyc
10334
0644
edit
dl
rm
code.pyo
10334
0644
edit
dl
rm
codecs.py
36143
0644
edit
dl
rm
codecs.pyc
36824
0644
edit
dl
rm
codecs.pyo
36824
0644
edit
dl
rm
codeop.py
5999
0644
edit
dl
rm
codeop.pyc
6597
0644
edit
dl
rm
codeop.pyo
6597
0644
edit
dl
rm
collections.py
27798
0644
edit
dl
rm
collections.pyc
26163
0644
edit
dl
rm
collections.pyo
26112
0644
edit
dl
rm
colorsys.py
3691
0644
edit
dl
rm
colorsys.pyc
3991
0644
edit
dl
rm
colorsys.pyo
3991
0644
edit
dl
rm
commands.py
2545
0644
edit
dl
rm
commands.pyc
2469
0644
edit
dl
rm
commands.pyo
2469
0644
edit
dl
rm
compileall.py
7763
0644
edit
dl
rm
compileall.pyc
7017
0644
edit
dl
rm
compileall.pyo
7017
0644
edit
dl
rm
ConfigParser.py
27746
0644
edit
dl
rm
ConfigParser.pyc
25213
0644
edit
dl
rm
ConfigParser.pyo
25213
0644
edit
dl
rm
contextlib.py
4424
0644
edit
dl
rm
contextlib.pyc
4454
0644
edit
dl
rm
contextlib.pyo
4454
0644
edit
dl
rm
Cookie.py
26538
0644
edit
dl
rm
Cookie.pyc
22658
0644
edit
dl
rm
Cookie.pyo
22658
0644
edit
dl
rm
cookielib.py
65486
0644
edit
dl
rm
cookielib.pyc
54725
0644
edit
dl
rm
cookielib.pyo
54537
0644
edit
dl
rm
copy.py
11533
0644
edit
dl
rm
copy.pyc
12170
0644
edit
dl
rm
copy.pyo
12078
0644
edit
dl
rm
copy_reg.py
6974
0644
edit
dl
rm
copy_reg.pyc
5167
0644
edit
dl
rm
copy_reg.pyo
5123
0644
edit
dl
rm
cProfile.py
6573
0755
edit
dl
rm
cProfile.pyc
6395
0644
edit
dl
rm
cProfile.pyo
6395
0644
edit
dl
rm
crypt.py
2292
0644
edit
dl
rm
crypt.pyc
2960
0644
edit
dl
rm
crypt.pyo
2960
0644
edit
dl
rm
csv.py
16708
0644
edit
dl
rm
csv.pyc
13507
0644
edit
dl
rm
csv.pyo
13507
0644
edit
dl
rm
dbhash.py
498
0644
edit
dl
rm
dbhash.pyc
718
0644
edit
dl
rm
dbhash.pyo
718
0644
edit
dl
rm
decimal.py
221933
0644
edit
dl
rm
decimal.pyc
172155
0644
edit
dl
rm
decimal.pyo
172155
0644
edit
dl
rm
difflib.py
82325
0644
edit
dl
rm
difflib.pyc
61898
0644
edit
dl
rm
difflib.pyo
61847
0644
edit
dl
rm
dircache.py
1126
0644
edit
dl
rm
dircache.pyc
1576
0644
edit
dl
rm
dircache.pyo
1576
0644
edit
dl
rm
dis.py
6499
0644
edit
dl
rm
dis.pyc
6228
0644
edit
dl
rm
dis.pyo
6228
0644
edit
dl
rm
doctest.py
105095
0644
edit
dl
rm
doctest.pyc
83637
0644
edit
dl
rm
doctest.pyo
83350
0644
edit
dl
rm
DocXMLRPCServer.py
10768
0644
edit
dl
rm
DocXMLRPCServer.pyc
10195
0644
edit
dl
rm
DocXMLRPCServer.pyo
10086
0644
edit
dl
rm
dumbdbm.py
9141
0644
edit
dl
rm
dumbdbm.pyc
6746
0644
edit
dl
rm
dumbdbm.pyo
6746
0644
edit
dl
rm
dummy_thread.py
4418
0644
edit
dl
rm
dummy_thread.pyc
5394
0644
edit
dl
rm
dummy_thread.pyo
5394
0644
edit
dl
rm
dummy_threading.py
2804
0644
edit
dl
rm
dummy_threading.pyc
1285
0644
edit
dl
rm
dummy_threading.pyo
1285
0644
edit
dl
rm
filecmp.py
9588
0644
edit
dl
rm
filecmp.pyc
9622
0644
edit
dl
rm
filecmp.pyo
9622
0644
edit
dl
rm
fileinput.py
13746
0644
edit
dl
rm
fileinput.pyc
14500
0644
edit
dl
rm
fileinput.pyo
14500
0644
edit
dl
rm
fnmatch.py
3315
0644
edit
dl
rm
fnmatch.pyc
3614
0644
edit
dl
rm
fnmatch.pyo
3614
0644
edit
dl
rm
formatter.py
14911
0644
edit
dl
rm
formatter.pyc
19178
0644
edit
dl
rm
formatter.pyo
19178
0644
edit
dl
rm
fpformat.py
4732
0644
edit
dl
rm
fpformat.pyc
4703
0644
edit
dl
rm
fpformat.pyo
4703
0644
edit
dl
rm
fractions.py
22390
0644
edit
dl
rm
fractions.pyc
19711
0644
edit
dl
rm
fractions.pyo
19711
0644
edit
dl
rm
ftplib.py
38555
0644
edit
dl
rm
ftplib.pyc
34939
0644
edit
dl
rm
ftplib.pyo
34939
0644
edit
dl
rm
functools.py
4806
0644
edit
dl
rm
functools.pyc
6629
0644
edit
dl
rm
functools.pyo
6629
0644
edit
dl
rm
genericpath.py
3201
0644
edit
dl
rm
genericpath.pyc
3517
0644
edit
dl
rm
genericpath.pyo
3517
0644
edit
dl
rm
getopt.py
7319
0644
edit
dl
rm
getopt.pyc
6654
0644
edit
dl
rm
getopt.pyo
6609
0644
edit
dl
rm
getpass.py
5563
0644
edit
dl
rm
getpass.pyc
4744
0644
edit
dl
rm
getpass.pyo
4744
0644
edit
dl
rm
gettext.py
22666
0644
edit
dl
rm
gettext.pyc
18004
0644
edit
dl
rm
gettext.pyo
18004
0644
edit
dl
rm
glob.py
3114
0644
edit
dl
rm
glob.pyc
2943
0644
edit
dl
rm
glob.pyo
2943
0644
edit
dl
rm
gzip.py
19028
0644
edit
dl
rm
gzip.pyc
15236
0644
edit
dl
rm
gzip.pyo
15236
0644
edit
dl
rm
hashlib.py
7841
0644
edit
dl
rm
hashlib.pyc
6919
0644
edit
dl
rm
hashlib.pyo
6919
0644
edit
dl
rm
heapq.py
18295
0644
edit
dl
rm
heapq.pyc
14564
0644
edit
dl
rm
heapq.pyo
14564
0644
edit
dl
rm
hmac.py
4588
0644
edit
dl
rm
hmac.pyc
4542
0644
edit
dl
rm
hmac.pyo
4542
0644
edit
dl
rm
htmlentitydefs.py
18056
0644
edit
dl
rm
htmlentitydefs.pyc
6367
0644
edit
dl
rm
htmlentitydefs.pyo
6367
0644
edit
dl
rm
htmllib.py
12869
0644
edit
dl
rm
htmllib.pyc
20309
0644
edit
dl
rm
htmllib.pyo
20309
0644
edit
dl
rm
HTMLParser.py
17171
0644
edit
dl
rm
HTMLParser.pyc
13727
0644
edit
dl
rm
HTMLParser.pyo
13422
0644
edit
dl
rm
httplib.py
53306
0644
edit
dl
rm
httplib.pyc
38724
0644
edit
dl
rm
httplib.pyo
38540
0644
edit
dl
rm
ihooks.py
18986
0644
edit
dl
rm
ihooks.pyc
21372
0644
edit
dl
rm
ihooks.pyo
21372
0644
edit
dl
rm
imaplib.py
48366
0644
edit
dl
rm
imaplib.pyc
45011
0644
edit
dl
rm
imaplib.pyo
42310
0644
edit
dl
rm
imghdr.py
3541
0644
edit
dl
rm
imghdr.pyc
4838
0644
edit
dl
rm
imghdr.pyo
4838
0644
edit
dl
rm
imputil.py
25764
0644
edit
dl
rm
imputil.pyc
15623
0644
edit
dl
rm
imputil.pyo
15445
0644
edit
dl
rm
inspect.py
43008
0644
edit
dl
rm
inspect.pyc
40229
0644
edit
dl
rm
inspect.pyo
40229
0644
edit
dl
rm
io.py
3322
0644
edit
dl
rm
io.pyc
3589
0644
edit
dl
rm
io.pyo
3589
0644
edit
dl
rm
keyword.py
1995
0755
edit
dl
rm
keyword.pyc
2105
0644
edit
dl
rm
keyword.pyo
2105
0644
edit
dl
rm
linecache.py
4027
0644
edit
dl
rm
linecache.pyc
3272
0644
edit
dl
rm
linecache.pyo
3272
0644
edit
dl
rm
locale.py
102834
0644
edit
dl
rm
locale.pyc
56610
0644
edit
dl
rm
locale.pyo
56610
0644
edit
dl
rm
macpath.py
6289
0644
edit
dl
rm
macpath.pyc
7681
0644
edit
dl
rm
macpath.pyo
7681
0644
edit
dl
rm
macurl2path.py
2731
0644
edit
dl
rm
macurl2path.pyc
2244
0644
edit
dl
rm
macurl2path.pyo
2244
0644
edit
dl
rm
mailbox.py
81240
0644
edit
dl
rm
mailbox.pyc
76717
0644
edit
dl
rm
mailbox.pyo
76670
0644
edit
dl
rm
mailcap.py
8404
0644
edit
dl
rm
mailcap.pyc
7955
0644
edit
dl
rm
mailcap.pyo
7955
0644
edit
dl
rm
markupbase.py
14643
0644
edit
dl
rm
markupbase.pyc
9267
0644
edit
dl
rm
markupbase.pyo
9071
0644
edit
dl
rm
md5.py
358
0644
edit
dl
rm
md5.pyc
378
0644
edit
dl
rm
md5.pyo
378
0644
edit
dl
rm
mhlib.py
33434
0644
edit
dl
rm
mhlib.pyc
33777
0644
edit
dl
rm
mhlib.pyo
33777
0644
edit
dl
rm
mimetools.py
7168
0644
edit
dl
rm
mimetools.pyc
8201
0644
edit
dl
rm
mimetools.pyo
8201
0644
edit
dl
rm
mimetypes.py
21028
0644
edit
dl
rm
mimetypes.pyc
18489
0644
edit
dl
rm
mimetypes.pyo
18489
0644
edit
dl
rm
MimeWriter.py
6482
0644
edit
dl
rm
MimeWriter.pyc
7364
0644
edit
dl
rm
MimeWriter.pyo
7364
0644
edit
dl
rm
mimify.py
15020
0755
edit
dl
rm
mimify.pyc
12001
0644
edit
dl
rm
mimify.pyo
12001
0644
edit
dl
rm
modulefinder.py
24461
0644
edit
dl
rm
modulefinder.pyc
19127
0644
edit
dl
rm
modulefinder.pyo
19045
0644
edit
dl
rm
multifile.py
4820
0644
edit
dl
rm
multifile.pyc
5420
0644
edit
dl
rm
multifile.pyo
5378
0644
edit
dl
rm
mutex.py
1878
0644
edit
dl
rm
mutex.pyc
2516
0644
edit
dl
rm
mutex.pyo
2516
0644
edit
dl
rm
netrc.py
5888
0644
edit
dl
rm
netrc.pyc
4714
0644
edit
dl
rm
netrc.pyo
4714
0644
edit
dl
rm
new.py
610
0644
edit
dl
rm
new.pyc
862
0644
edit
dl
rm
new.pyo
862
0644
edit
dl
rm
nntplib.py
21470
0644
edit
dl
rm
nntplib.pyc
21044
0644
edit
dl
rm
nntplib.pyo
21044
0644
edit
dl
rm
ntpath.py
19429
0644
edit
dl
rm
ntpath.pyc
13129
0644
edit
dl
rm
ntpath.pyo
13129
0644
edit
dl
rm
nturl2path.py
2419
0644
edit
dl
rm
nturl2path.pyc
1815
0644
edit
dl
rm
nturl2path.pyo
1815
0644
edit
dl
rm
numbers.py
10319
0644
edit
dl
rm
numbers.pyc
14012
0644
edit
dl
rm
numbers.pyo
14012
0644
edit
dl
rm
opcode.py
5474
0644
edit
dl
rm
opcode.pyc
6145
0644
edit
dl
rm
opcode.pyo
6145
0644
edit
dl
rm
optparse.py
61203
0644
edit
dl
rm
optparse.pyc
53894
0644
edit
dl
rm
optparse.pyo
53811
0644
edit
dl
rm
os.py
25910
0644
edit
dl
rm
os.pyc
25689
0644
edit
dl
rm
os.pyo
25689
0644
edit
dl
rm
os2emxpath.py
4635
0644
edit
dl
rm
os2emxpath.pyc
4525
0644
edit
dl
rm
os2emxpath.pyo
4525
0644
edit
dl
rm
pdb.doc
7914
0644
edit
dl
rm
pdb.py
46098
0755
edit
dl
rm
pdb.pyc
43669
0644
edit
dl
rm
pdb.pyo
43669
0644
edit
dl
rm
pickle.py
45489
0644
edit
dl
rm
pickle.pyc
38560
0644
edit
dl
rm
pickle.pyo
38364
0644
edit
dl
rm
pickletools.py
74523
0644
edit
dl
rm
pickletools.pyc
57032
0644
edit
dl
rm
pickletools.pyo
56171
0644
edit
dl
rm
pipes.py
9582
0644
edit
dl
rm
pipes.pyc
9308
0644
edit
dl
rm
pipes.pyo
9308
0644
edit
dl
rm
pkgutil.py
20243
0644
edit
dl
rm
pkgutil.pyc
18959
0644
edit
dl
rm
pkgutil.pyo
18959
0644
edit
dl
rm
platform.py
52801
0755
edit
dl
rm
platform.pyc
37971
0644
edit
dl
rm
platform.pyo
37971
0644
edit
dl
rm
plistlib.py
15810
0644
edit
dl
rm
plistlib.pyc
19963
0644
edit
dl
rm
plistlib.pyo
19877
0644
edit
dl
rm
popen2.py
8416
0644
edit
dl
rm
popen2.pyc
9025
0644
edit
dl
rm
popen2.pyo
8983
0644
edit
dl
rm
poplib.py
12824
0644
edit
dl
rm
poplib.pyc
13345
0644
edit
dl
rm
poplib.pyo
13345
0644
edit
dl
rm
posixfile.py
8003
0644
edit
dl
rm
posixfile.pyc
7652
0644
edit
dl
rm
posixfile.pyo
7652
0644
edit
dl
rm
posixpath.py
14293
0644
edit
dl
rm
posixpath.pyc
11462
0644
edit
dl
rm
posixpath.pyo
11462
0644
edit
dl
rm
pprint.py
11777
0644
edit
dl
rm
pprint.pyc
10194
0644
edit
dl
rm
pprint.pyo
10017
0644
edit
dl
rm
profile.py
22781
0755
edit
dl
rm
profile.pyc
16456
0644
edit
dl
rm
profile.pyo
16209
0644
edit
dl
rm
pstats.py
26712
0644
edit
dl
rm
pstats.pyc
25013
0644
edit
dl
rm
pstats.pyo
25013
0644
edit
dl
rm
pty.py
5058
0644
edit
dl
rm
pty.pyc
4966
0644
edit
dl
rm
pty.pyo
4966
0644
edit
dl
rm
pyclbr.py
13388
0644
edit
dl
rm
pyclbr.pyc
9651
0644
edit
dl
rm
pyclbr.pyo
9651
0644
edit
dl
rm
pydoc.py
95739
0755
edit
dl
rm
pydoc.pyc
92342
0644
edit
dl
rm
pydoc.pyo
92278
0644
edit
dl
rm
py_compile.py
5936
0644
edit
dl
rm
py_compile.pyc
6428
0644
edit
dl
rm
py_compile.pyo
6428
0644
edit
dl
rm
Queue.py
8577
0644
edit
dl
rm
Queue.pyc
9424
0644
edit
dl
rm
Queue.pyo
9424
0644
edit
dl
rm
quopri.py
6968
0755
edit
dl
rm
quopri.pyc
6574
0644
edit
dl
rm
quopri.pyo
6574
0644
edit
dl
rm
random.py
32457
0644
edit
dl
rm
random.pyc
25704
0644
edit
dl
rm
random.pyo
25704
0644
edit
dl
rm
re.py
13423
0644
edit
dl
rm
re.pyc
13413
0644
edit
dl
rm
re.pyo
13413
0644
edit
dl
rm
repr.py
4296
0644
edit
dl
rm
repr.pyc
5385
0644
edit
dl
rm
repr.pyo
5385
0644
edit
dl
rm
rexec.py
20148
0644
edit
dl
rm
rexec.pyc
23807
0644
edit
dl
rm
rexec.pyo
23807
0644
edit
dl
rm
rfc822.py
33542
0644
edit
dl
rm
rfc822.pyc
31813
0644
edit
dl
rm
rfc822.pyo
31813
0644
edit
dl
rm
rlcompleter.py
5991
0644
edit
dl
rm
rlcompleter.pyc
6078
0644
edit
dl
rm
rlcompleter.pyo
6078
0644
edit
dl
rm
robotparser.py
7695
0644
edit
dl
rm
robotparser.pyc
8003
0644
edit
dl
rm
robotparser.pyo
8003
0644
edit
dl
rm
runpy.py
11081
0644
edit
dl
rm
runpy.pyc
8803
0644
edit
dl
rm
runpy.pyo
8803
0644
edit
dl
rm
sched.py
5088
0644
edit
dl
rm
sched.pyc
4994
0644
edit
dl
rm
sched.pyo
4994
0644
edit
dl
rm
sets.py
19050
0644
edit
dl
rm
sets.pyc
16895
0644
edit
dl
rm
sets.pyo
16895
0644
edit
dl
rm
sgmllib.py
17884
0644
edit
dl
rm
sgmllib.pyc
15436
0644
edit
dl
rm
sgmllib.pyo
15436
0644
edit
dl
rm
sha.py
393
0644
edit
dl
rm
sha.pyc
421
0644
edit
dl
rm
sha.pyo
421
0644
edit
dl
rm
shelve.py
8178
0644
edit
dl
rm
shelve.pyc
10256
0644
edit
dl
rm
shelve.pyo
10256
0644
edit
dl
rm
shlex.py
11164
0644
edit
dl
rm
shlex.pyc
7558
0644
edit
dl
rm
shlex.pyo
7558
0644
edit
dl
rm
shutil.py
19871
0644
edit
dl
rm
shutil.pyc
19259
0644
edit
dl
rm
shutil.pyo
19259
0644
edit
dl
rm
SimpleHTTPServer.py
7997
0644
edit
dl
rm
SimpleHTTPServer.pyc
8010
0644
edit
dl
rm
SimpleHTTPServer.pyo
8010
0644
edit
dl
rm
SimpleXMLRPCServer.py
25812
0644
edit
dl
rm
SimpleXMLRPCServer.pyc
22863
0644
edit
dl
rm
SimpleXMLRPCServer.pyo
22863
0644
edit
dl
rm
site.py
21296
0644
edit
dl
rm
site.pyc
20786
0644
edit
dl
rm
site.pyo
20786
0644
edit
dl
rm
smtpd.py
18542
0755
edit
dl
rm
smtpd.pyc
15883
0644
edit
dl
rm
smtpd.pyo
15883
0644
edit
dl
rm
smtplib.py
32134
0755
edit
dl
rm
smtplib.pyc
30304
0644
edit
dl
rm
smtplib.pyo
30304
0644
edit
dl
rm
sndhdr.py
5973
0644
edit
dl
rm
sndhdr.pyc
7361
0644
edit
dl
rm
sndhdr.pyo
7361
0644
edit
dl
rm
socket.py
20615
0644
edit
dl
rm
socket.pyc
16152
0644
edit
dl
rm
socket.pyo
16066
0644
edit
dl
rm
SocketServer.py
23948
0644
edit
dl
rm
SocketServer.pyc
24087
0644
edit
dl
rm
SocketServer.pyo
24087
0644
edit
dl
rm
sre.py
384
0644
edit
dl
rm
sre.pyc
519
0644
edit
dl
rm
sre.pyo
519
0644
edit
dl
rm
sre_compile.py
19823
0644
edit
dl
rm
sre_compile.pyc
12560
0644
edit
dl
rm
sre_compile.pyo
12404
0644
edit
dl
rm
sre_constants.py
7197
0644
edit
dl
rm
sre_constants.pyc
6195
0644
edit
dl
rm
sre_constants.pyo
6195
0644
edit
dl
rm
sre_parse.py
30700
0644
edit
dl
rm
sre_parse.pyc
21156
0644
edit
dl
rm
sre_parse.pyo
21156
0644
edit
dl
rm
ssl.py
39310
0644
edit
dl
rm
ssl.pyc
32716
0644
edit
dl
rm
ssl.pyo
32716
0644
edit
dl
rm
stat.py
1842
0644
edit
dl
rm
stat.pyc
2751
0644
edit
dl
rm
stat.pyo
2751
0644
edit
dl
rm
statvfs.py
898
0644
edit
dl
rm
statvfs.pyc
620
0644
edit
dl
rm
statvfs.pyo
620
0644
edit
dl
rm
string.py
21548
0644
edit
dl
rm
string.pyc
20459
0644
edit
dl
rm
string.pyo
20459
0644
edit
dl
rm
StringIO.py
10662
0644
edit
dl
rm
StringIO.pyc
11480
0644
edit
dl
rm
StringIO.pyo
11480
0644
edit
dl
rm
stringold.py
12449
0644
edit
dl
rm
stringold.pyc
12549
0644
edit
dl
rm
stringold.pyo
12549
0644
edit
dl
rm
stringprep.py
13522
0644
edit
dl
rm
stringprep.pyc
14487
0644
edit
dl
rm
stringprep.pyo
14415
0644
edit
dl
rm
struct.py
82
0644
edit
dl
rm
struct.pyc
239
0644
edit
dl
rm
struct.pyo
239
0644
edit
dl
rm
subprocess.py
50520
0644
edit
dl
rm
subprocess.pyc
32398
0644
edit
dl
rm
subprocess.pyo
32398
0644
edit
dl
rm
sunau.py
17222
0644
edit
dl
rm
sunau.pyc
18394
0644
edit
dl
rm
sunau.pyo
18394
0644
edit
dl
rm
sunaudio.py
1399
0644
edit
dl
rm
sunaudio.pyc
1987
0644
edit
dl
rm
sunaudio.pyo
1987
0644
edit
dl
rm
symbol.py
2057
0755
edit
dl
rm
symbol.pyc
3026
0644
edit
dl
rm
symbol.pyo
3026
0644
edit
dl
rm
symtable.py
7437
0644
edit
dl
rm
symtable.pyc
11786
0644
edit
dl
rm
symtable.pyo
11655
0644
edit
dl
rm
sysconfig.py
22852
0644
edit
dl
rm
sysconfig.pyc
17818
0644
edit
dl
rm
sysconfig.pyo
17818
0644
edit
dl
rm
tabnanny.py
11339
0755
edit
dl
rm
tabnanny.pyc
8247
0644
edit
dl
rm
tabnanny.pyo
8247
0644
edit
dl
rm
tarfile.py
90655
0644
edit
dl
rm
tarfile.pyc
76193
0644
edit
dl
rm
tarfile.pyo
76193
0644
edit
dl
rm
telnetlib.py
27036
0644
edit
dl
rm
telnetlib.pyc
23154
0644
edit
dl
rm
telnetlib.pyo
23154
0644
edit
dl
rm
tempfile.py
19547
0644
edit
dl
rm
tempfile.pyc
20344
0644
edit
dl
rm
tempfile.pyo
20344
0644
edit
dl
rm
textwrap.py
17280
0644
edit
dl
rm
textwrap.pyc
12097
0644
edit
dl
rm
textwrap.pyo
12005
0644
edit
dl
rm
this.py
1002
0644
edit
dl
rm
this.pyc
1220
0644
edit
dl
rm
this.pyo
1220
0644
edit
dl
rm
threading.py
47377
0644
edit
dl
rm
threading.pyc
42726
0644
edit
dl
rm
threading.pyo
40552
0644
edit
dl
rm
timeit.py
12791
0755
edit
dl
rm
timeit.pyc
12183
0644
edit
dl
rm
timeit.pyo
12183
0644
edit
dl
rm
toaiff.py
3142
0644
edit
dl
rm
toaiff.pyc
3106
0644
edit
dl
rm
toaiff.pyo
3106
0644
edit
dl
rm
token.py
2922
0644
edit
dl
rm
token.pyc
3816
0644
edit
dl
rm
token.pyo
3816
0644
edit
dl
rm
tokenize.py
17483
0644
edit
dl
rm
tokenize.pyc
14505
0644
edit
dl
rm
tokenize.pyo
14449
0644
edit
dl
rm
trace.py
29891
0755
edit
dl
rm
trace.pyc
22793
0644
edit
dl
rm
trace.pyo
22730
0644
edit
dl
rm
traceback.py
11285
0644
edit
dl
rm
traceback.pyc
11679
0644
edit
dl
rm
traceback.pyo
11679
0644
edit
dl
rm
tty.py
879
0644
edit
dl
rm
tty.pyc
1317
0644
edit
dl
rm
tty.pyo
1317
0644
edit
dl
rm
types.py
2094
0644
edit
dl
rm
types.pyc
2725
0644
edit
dl
rm
types.pyo
2725
0644
edit
dl
rm
urllib.py
60228
0644
edit
dl
rm
urllib.pyc
51241
0644
edit
dl
rm
urllib.pyo
51146
0644
edit
dl
rm
urllib2.py
52541
0644
edit
dl
rm
urllib2.pyc
47302
0644
edit
dl
rm
urllib2.pyo
47207
0644
edit
dl
rm
urlparse.py
20461
0644
edit
dl
rm
urlparse.pyc
18015
0644
edit
dl
rm
urlparse.pyo
18015
0644
edit
dl
rm
user.py
1627
0644
edit
dl
rm
user.pyc
1724
0644
edit
dl
rm
user.pyo
1724
0644
edit
dl
rm
UserDict.py
7060
0644
edit
dl
rm
UserDict.pyc
9711
0644
edit
dl
rm
UserDict.pyo
9711
0644
edit
dl
rm
UserList.py
3644
0644
edit
dl
rm
UserList.pyc
6577
0644
edit
dl
rm
UserList.pyo
6577
0644
edit
dl
rm
UserString.py
9687
0755
edit
dl
rm
UserString.pyc
14864
0644
edit
dl
rm
UserString.pyo
14864
0644
edit
dl
rm
uu.py
6697
0755
edit
dl
rm
uu.pyc
4390
0644
edit
dl
rm
uu.pyo
4390
0644
edit
dl
rm
uuid.py
23530
0644
edit
dl
rm
uuid.pyc
23366
0644
edit
dl
rm
uuid.pyo
23250
0644
edit
dl
rm
warnings.py
14823
0644
edit
dl
rm
warnings.pyc
13510
0644
edit
dl
rm
warnings.pyo
12721
0644
edit
dl
rm
wave.py
18582
0644
edit
dl
rm
wave.pyc
20013
0644
edit
dl
rm
wave.pyo
19869
0644
edit
dl
rm
weakref.py
14830
0644
edit
dl
rm
weakref.pyc
16441
0644
edit
dl
rm
weakref.pyo
16441
0644
edit
dl
rm
webbrowser.py
22725
0755
edit
dl
rm
webbrowser.pyc
19750
0644
edit
dl
rm
webbrowser.pyo
19705
0644
edit
dl
rm
whichdb.py
3379
0644
edit
dl
rm
whichdb.pyc
2241
0644
edit
dl
rm
whichdb.pyo
2241
0644
edit
dl
rm
wsgiref.egg-info
187
0644
edit
dl
rm
xdrlib.py
6069
0644
edit
dl
rm
xdrlib.pyc
9902
0644
edit
dl
rm
xdrlib.pyo
9902
0644
edit
dl
rm
xmllib.py
34865
0644
edit
dl
rm
xmllib.pyc
26848
0644
edit
dl
rm
xmllib.pyo
26848
0644
edit
dl
rm
xmlrpclib.py
52136
0644
edit
dl
rm
xmlrpclib.pyc
44106
0644
edit
dl
rm
xmlrpclib.pyo
43922
0644
edit
dl
rm
zipfile.py
59477
0644
edit
dl
rm
zipfile.pyc
42137
0644
edit
dl
rm
zipfile.pyo
42137
0644
edit
dl
rm
_abcoll.py
18619
0644
edit
dl
rm
_abcoll.pyc
25682
0644
edit
dl
rm
_abcoll.pyo
25682
0644
edit
dl
rm
_LWPCookieJar.py
6553
0644
edit
dl
rm
_LWPCookieJar.pyc
5434
0644
edit
dl
rm
_LWPCookieJar.pyo
5434
0644
edit
dl
rm
_MozillaCookieJar.py
5797
0644
edit
dl
rm
_MozillaCookieJar.pyc
4461
0644
edit
dl
rm
_MozillaCookieJar.pyo
4422
0644
edit
dl
rm
_osx_support.py
19100
0644
edit
dl
rm
_osx_support.pyc
11758
0644
edit
dl
rm
_osx_support.pyo
11758
0644
edit
dl
rm
_pyio.py
69630
0644
edit
dl
rm
_pyio.pyc
64701
0644
edit
dl
rm
_pyio.pyo
64701
0644
edit
dl
rm
_strptime.py
20728
0644
edit
dl
rm
_strptime.pyc
15172
0644
edit
dl
rm
_strptime.pyo
15172
0644
edit
dl
rm
_sysconfigdata.py
19732
0644
edit
dl
rm
_sysconfigdata.pyc
22968
0644
edit
dl
rm
_sysconfigdata.pyo
22968
0644
edit
dl
rm
_threading_local.py
7260
0644
edit
dl
rm
_threading_local.pyc
6373
0644
edit
dl
rm
_threading_local.pyo
6373
0644
edit
dl
rm
_weakrefset.py
5911
0644
edit
dl
rm
_weakrefset.pyc
9678
0644
edit
dl
rm
_weakrefset.pyo
9678
0644
edit
dl
rm
__future__.py
4380
0644
edit
dl
rm
__future__.pyc
4223
0644
edit
dl
rm
__future__.pyo
4223
0644
edit
dl
rm
__phello__.foo.py
64
0644
edit
dl
rm
__phello__.foo.pyc
125
0644
edit
dl
rm
__phello__.foo.pyo
125
0644
edit
dl
rm
Edit:
/usr/lib64/python2.7/platform.py
(52801B)
#! /usr/bin/python2.7 """ This module tries to retrieve as much platform-identifying data as possible. It makes this information available via function APIs. If called from the command line, it prints the platform information concatenated as single string to stdout. The output format is useable as part of a filename. """ # This module is maintained by Marc-Andre Lemburg <mal@egenix.com>. # If you find problems, please submit bug reports/patches via the # Python bug tracker (http://bugs.python.org) and assign them to "lemburg". # # Note: Please keep this module compatible to Python 1.5.2. # # Still needed: # * more support for WinCE # * support for MS-DOS (PythonDX ?) # * support for Amiga and other still unsupported platforms running Python # * support for additional Linux distributions # # Many thanks to all those who helped adding platform-specific # checks (in no particular order): # # Charles G Waldman, David Arnold, Gordon McMillan, Ben Darnell, # Jeff Bauer, Cliff Crawford, Ivan Van Laningham, Josef # Betancourt, Randall Hopper, Karl Putland, John Farrell, Greg # Andruk, Just van Rossum, Thomas Heller, Mark R. Levinson, Mark # Hammond, Bill Tutt, Hans Nowak, Uwe Zessin (OpenVMS support), # Colin Kong, Trent Mick, Guido van Rossum, Anthony Baxter, Steve # Dower # # History: # # <see CVS and SVN checkin messages for history> # # 1.0.8 - changed Windows support to read version from kernel32.dll # 1.0.7 - added DEV_NULL # 1.0.6 - added linux_distribution() # 1.0.5 - fixed Java support to allow running the module on Jython # 1.0.4 - added IronPython support # 1.0.3 - added normalization of Windows system name # 1.0.2 - added more Windows support # 1.0.1 - reformatted to make doc.py happy # 1.0.0 - reformatted a bit and checked into Python CVS # 0.8.0 - added sys.version parser and various new access # APIs (python_version(), python_compiler(), etc.) # 0.7.2 - fixed architecture() to use sizeof(pointer) where available # 0.7.1 - added support for Caldera OpenLinux # 0.7.0 - some fixes for WinCE; untabified the source file # 0.6.2 - support for OpenVMS - requires version 1.5.2-V006 or higher and # vms_lib.getsyi() configured # 0.6.1 - added code to prevent 'uname -p' on platforms which are # known not to support it # 0.6.0 - fixed win32_ver() to hopefully work on Win95,98,NT and Win2k; # did some cleanup of the interfaces - some APIs have changed # 0.5.5 - fixed another type in the MacOS code... should have # used more coffee today ;-) # 0.5.4 - fixed a few typos in the MacOS code # 0.5.3 - added experimental MacOS support; added better popen() # workarounds in _syscmd_ver() -- still not 100% elegant # though # 0.5.2 - fixed uname() to return '' instead of 'unknown' in all # return values (the system uname command tends to return # 'unknown' instead of just leaving the field empty) # 0.5.1 - included code for slackware dist; added exception handlers # to cover up situations where platforms don't have os.popen # (e.g. Mac) or fail on socket.gethostname(); fixed libc # detection RE # 0.5.0 - changed the API names referring to system commands to *syscmd*; # added java_ver(); made syscmd_ver() a private # API (was system_ver() in previous versions) -- use uname() # instead; extended the win32_ver() to also return processor # type information # 0.4.0 - added win32_ver() and modified the platform() output for WinXX # 0.3.4 - fixed a bug in _follow_symlinks() # 0.3.3 - fixed popen() and "file" command invokation bugs # 0.3.2 - added architecture() API and support for it in platform() # 0.3.1 - fixed syscmd_ver() RE to support Windows NT # 0.3.0 - added system alias support # 0.2.3 - removed 'wince' again... oh well. # 0.2.2 - added 'wince' to syscmd_ver() supported platforms # 0.2.1 - added cache logic and changed the platform string format # 0.2.0 - changed the API to use functions instead of module globals # since some action take too long to be run on module import # 0.1.0 - first release # # You can always get the latest version of this module at: # # http://www.egenix.com/files/python/platform.py # # If that URL should fail, try contacting the author. __copyright__ = """ Copyright (c) 1999-2000, Marc-Andre Lemburg; mailto:mal@lemburg.com Copyright (c) 2000-2010, eGenix.com Software GmbH; mailto:info@egenix.com Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee or royalty is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation or portions thereof, including modifications, that you make. EGENIX.COM SOFTWARE GMBH DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE ! """ __version__ = '1.0.7' import sys,string,os,re ### Globals & Constants # Determine the platform's /dev/null device try: DEV_NULL = os.devnull except AttributeError: # os.devnull was added in Python 2.4, so emulate it for earlier # Python versions if sys.platform in ('dos','win32','win16','os2'): # Use the old CP/M NUL as device name DEV_NULL = 'NUL' else: # Standard Unix uses /dev/null DEV_NULL = '/dev/null' # Helper for comparing two version number strings. # Based on the description of the PHP's version_compare(): # http://php.net/manual/en/function.version-compare.php _ver_stages = { # any string not found in this dict, will get 0 assigned 'dev': 10, 'alpha': 20, 'a': 20, 'beta': 30, 'b': 30, 'c': 40, 'RC': 50, 'rc': 50, # number, will get 100 assigned 'pl': 200, 'p': 200, } _component_re = re.compile(r'([0-9]+|[._+-])') def _comparable_version(version): result = [] for v in _component_re.split(version): if v not in '._+-': try: v = int(v, 10) t = 100 except ValueError: t = _ver_stages.get(v, 0) result.extend((t, v)) return result ### Platform specific APIs _libc_search = re.compile(r'(__libc_init)' '|' '(GLIBC_([0-9.]+))' '|' '(libc(_\w+)?\.so(?:\.(\d[0-9.]*))?)') def libc_ver(executable=sys.executable,lib='',version='', chunksize=2048): """ Tries to determine the libc version that the file executable (which defaults to the Python interpreter) is linked against. Returns a tuple of strings (lib,version) which default to the given parameters in case the lookup fails. Note that the function has intimate knowledge of how different libc versions add symbols to the executable and thus is probably only useable for executables compiled using gcc. The file is read and scanned in chunks of chunksize bytes. """ V = _comparable_version if hasattr(os.path, 'realpath'): # Python 2.2 introduced os.path.realpath(); it is used # here to work around problems with Cygwin not being # able to open symlinks for reading executable = os.path.realpath(executable) with open(executable, 'rb') as f: binary = f.read(chunksize) pos = 0 while pos < len(binary): if 'libc' in binary or 'GLIBC' in binary: m = _libc_search.search(binary, pos) else: m = None if not m or m.end() == len(binary): chunk = f.read(chunksize) if chunk: binary = binary[max(pos, len(binary) - 1000):] + chunk pos = 0 continue if not m: break libcinit,glibc,glibcversion,so,threads,soversion = m.groups() if libcinit and not lib: lib = 'libc' elif glibc: if lib != 'glibc': lib = 'glibc' version = glibcversion elif V(glibcversion) > V(version): version = glibcversion elif so: if lib != 'glibc': lib = 'libc' if soversion and (not version or V(soversion) > V(version)): version = soversion if threads and version[-len(threads):] != threads: version = version + threads pos = m.end() return lib,version def _dist_try_harder(distname,version,id): """ Tries some special tricks to get the distribution information in case the default method fails. Currently supports older SuSE Linux, Caldera OpenLinux and Slackware Linux distributions. """ if os.path.exists('/var/adm/inst-log/info'): # SuSE Linux stores distribution information in that file info = open('/var/adm/inst-log/info').readlines() distname = 'SuSE' for line in info: tv = string.split(line) if len(tv) == 2: tag,value = tv else: continue if tag == 'MIN_DIST_VERSION': version = string.strip(value) elif tag == 'DIST_IDENT': values = string.split(value,'-') id = values[2] return distname,version,id if os.path.exists('/etc/.installed'): # Caldera OpenLinux has some infos in that file (thanks to Colin Kong) info = open('/etc/.installed').readlines() for line in info: pkg = string.split(line,'-') if len(pkg) >= 2 and pkg[0] == 'OpenLinux': # XXX does Caldera support non Intel platforms ? If yes, # where can we find the needed id ? return 'OpenLinux',pkg[1],id if os.path.isdir('/usr/lib/setup'): # Check for slackware version tag file (thanks to Greg Andruk) verfiles = os.listdir('/usr/lib/setup') for n in range(len(verfiles)-1, -1, -1): if verfiles[n][:14] != 'slack-version-': del verfiles[n] if verfiles: verfiles.sort() distname = 'slackware' version = verfiles[-1][14:] return distname,version,id return distname,version,id _release_filename = re.compile(r'(\w+)[-_](release|version)') _lsb_release_version = re.compile(r'(.+)' ' release ' '([\d.]+)' '[^(]*(?:\((.+)\))?') _release_version = re.compile(r'([^0-9]+)' '(?: release )?' '([\d.]+)' '[^(]*(?:\((.+)\))?') # See also http://www.novell.com/coolsolutions/feature/11251.html # and http://linuxmafia.com/faq/Admin/release-files.html # and http://data.linux-ntfs.org/rpm/whichrpm # and http://www.die.net/doc/linux/man/man1/lsb_release.1.html _supported_dists = ( 'SuSE', 'debian', 'fedora', 'redhat', 'centos', 'almalinux', 'mandrake', 'mandriva', 'rocks', 'slackware', 'yellowdog', 'gentoo', 'UnitedLinux', 'turbolinux') def _parse_release_file(firstline): # Default to empty 'version' and 'id' strings. Both defaults are used # when 'firstline' is empty. 'id' defaults to empty when an id can not # be deduced. version = '' id = '' # Parse the first line m = _lsb_release_version.match(firstline) if m is not None: # LSB format: "distro release x.x (codename)" return tuple(m.groups()) # Pre-LSB format: "distro x.x (codename)" m = _release_version.match(firstline) if m is not None: return tuple(m.groups()) # Unknown format... take the first two words l = string.split(string.strip(firstline)) if l: version = l[0] if len(l) > 1: id = l[1] return '', version, id def linux_distribution(distname='', version='', id='', supported_dists=_supported_dists, full_distribution_name=1): """ Tries to determine the name of the Linux OS distribution name. The function first looks for a distribution release file in /etc and then reverts to _dist_try_harder() in case no suitable files are found. supported_dists may be given to define the set of Linux distributions to look for. It defaults to a list of currently supported Linux distributions identified by their release file name. If full_distribution_name is true (default), the full distribution read from the OS is returned. Otherwise the short name taken from supported_dists is used. Returns a tuple (distname,version,id) which default to the args given as parameters. """ try: etc = os.listdir('/etc') except os.error: # Probably not a Unix system return distname,version,id etc.sort() for file in etc: m = _release_filename.match(file) if m is not None: _distname,dummy = m.groups() if _distname in supported_dists: distname = _distname break else: return _dist_try_harder(distname,version,id) # Read the first line f = open('/etc/'+file, 'r') firstline = f.readline() f.close() _distname, _version, _id = _parse_release_file(firstline) if _distname and full_distribution_name: distname = _distname if _version: version = _version if _id: id = _id return distname, version, id # To maintain backwards compatibility: def dist(distname='',version='',id='', supported_dists=_supported_dists): """ Tries to determine the name of the Linux OS distribution name. The function first looks for a distribution release file in /etc and then reverts to _dist_try_harder() in case no suitable files are found. Returns a tuple (distname,version,id) which default to the args given as parameters. """ return linux_distribution(distname, version, id, supported_dists=supported_dists, full_distribution_name=0) class _popen: """ Fairly portable (alternative) popen implementation. This is mostly needed in case os.popen() is not available, or doesn't work as advertised, e.g. in Win9X GUI programs like PythonWin or IDLE. Writing to the pipe is currently not supported. """ tmpfile = '' pipe = None bufsize = None mode = 'r' def __init__(self,cmd,mode='r',bufsize=None): if mode != 'r': raise ValueError,'popen()-emulation only supports read mode' import tempfile self.tmpfile = tmpfile = tempfile.mktemp() os.system(cmd + ' > %s' % tmpfile) self.pipe = open(tmpfile,'rb') self.bufsize = bufsize self.mode = mode def read(self): return self.pipe.read() def readlines(self): if self.bufsize is not None: return self.pipe.readlines() def close(self, remove=os.unlink,error=os.error): if self.pipe: rc = self.pipe.close() else: rc = 255 if self.tmpfile: try: remove(self.tmpfile) except error: pass return rc # Alias __del__ = close def popen(cmd, mode='r', bufsize=None): """ Portable popen() interface. """ # Find a working popen implementation preferring win32pipe.popen # over os.popen over _popen popen = None if os.environ.get('OS','') == 'Windows_NT': # On NT win32pipe should work; on Win9x it hangs due to bugs # in the MS C lib (see MS KnowledgeBase article Q150956) try: import win32pipe except ImportError: pass else: popen = win32pipe.popen if popen is None: if hasattr(os,'popen'): popen = os.popen # Check whether it works... it doesn't in GUI programs # on Windows platforms if sys.platform == 'win32': # XXX Others too ? try: popen('') except os.error: popen = _popen else: popen = _popen if bufsize is None: return popen(cmd,mode) else: return popen(cmd,mode,bufsize) def _norm_version(version, build=''): """ Normalize the version and build strings and return a single version string using the format major.minor.build (or patchlevel). """ l = string.split(version,'.') if build: l.append(build) try: ints = map(int,l) except ValueError: strings = l else: strings = map(str,ints) version = string.join(strings[:3],'.') return version _ver_output = re.compile(r'(?:([\w ]+) ([\w.]+) ' '.*' '\[.* ([\d.]+)\])') # Examples of VER command output: # # Windows 2000: Microsoft Windows 2000 [Version 5.00.2195] # Windows XP: Microsoft Windows XP [Version 5.1.2600] # Windows Vista: Microsoft Windows [Version 6.0.6002] # # Note that the "Version" string gets localized on different # Windows versions. def _syscmd_ver(system='', release='', version='', supported_platforms=('win32','win16','dos','os2')): """ Tries to figure out the OS version used and returns a tuple (system,release,version). It uses the "ver" shell command for this which is known to exists on Windows, DOS and OS/2. XXX Others too ? In case this fails, the given parameters are used as defaults. """ if sys.platform not in supported_platforms: return system,release,version # Try some common cmd strings for cmd in ('ver','command /c ver','cmd /c ver'): try: pipe = popen(cmd) info = pipe.read() if pipe.close(): raise os.error,'command failed' # XXX How can I suppress shell errors from being written # to stderr ? except os.error,why: #print 'Command %s failed: %s' % (cmd,why) continue except IOError,why: #print 'Command %s failed: %s' % (cmd,why) continue else: break else: return system,release,version # Parse the output info = string.strip(info) m = _ver_output.match(info) if m is not None: system,release,version = m.groups() # Strip trailing dots from version and release if release[-1] == '.': release = release[:-1] if version[-1] == '.': version = version[:-1] # Normalize the version and build strings (eliminating additional # zeros) version = _norm_version(version) return system,release,version _WIN32_CLIENT_RELEASES = { (5, 0): "2000", (5, 1): "XP", # Strictly, 5.2 client is XP 64-bit, but platform.py historically # has always called it 2003 Server (5, 2): "2003Server", (5, None): "post2003", (6, 0): "Vista", (6, 1): "7", (6, 2): "8", (6, 3): "8.1", (6, None): "post8.1", (10, 0): "10", (10, None): "post10", } # Server release name lookup will default to client names if necessary _WIN32_SERVER_RELEASES = { (5, 2): "2003Server", (6, 0): "2008Server", (6, 1): "2008ServerR2", (6, 2): "2012Server", (6, 3): "2012ServerR2", (6, None): "post2012ServerR2", } def _get_real_winver(maj, min, build): if maj < 6 or (maj == 6 and min < 2): return maj, min, build from ctypes import (c_buffer, POINTER, byref, create_unicode_buffer, Structure, WinDLL, _Pointer) from ctypes.wintypes import DWORD, HANDLE class VS_FIXEDFILEINFO(Structure): _fields_ = [ ("dwSignature", DWORD), ("dwStrucVersion", DWORD), ("dwFileVersionMS", DWORD), ("dwFileVersionLS", DWORD), ("dwProductVersionMS", DWORD), ("dwProductVersionLS", DWORD), ("dwFileFlagsMask", DWORD), ("dwFileFlags", DWORD), ("dwFileOS", DWORD), ("dwFileType", DWORD), ("dwFileSubtype", DWORD), ("dwFileDateMS", DWORD), ("dwFileDateLS", DWORD), ] class PVS_FIXEDFILEINFO(_Pointer): _type_ = VS_FIXEDFILEINFO kernel32 = WinDLL('kernel32') version = WinDLL('version') # We will immediately double the length up to MAX_PATH, but the # path may be longer, so we retry until the returned string is # shorter than our buffer. name_len = actual_len = 130 while actual_len == name_len: name_len *= 2 name = create_unicode_buffer(name_len) actual_len = kernel32.GetModuleFileNameW(HANDLE(kernel32._handle), name, len(name)) if not actual_len: return maj, min, build size = version.GetFileVersionInfoSizeW(name, None) if not size: return maj, min, build ver_block = c_buffer(size) if (not version.GetFileVersionInfoW(name, None, size, ver_block) or not ver_block): return maj, min, build pvi = PVS_FIXEDFILEINFO() if not version.VerQueryValueW(ver_block, "", byref(pvi), byref(DWORD())): return maj, min, build maj = pvi.contents.dwProductVersionMS >> 16 min = pvi.contents.dwProductVersionMS & 0xFFFF build = pvi.contents.dwProductVersionLS >> 16 return maj, min, build def win32_ver(release='', version='', csd='', ptype=''): try: from sys import getwindowsversion except ImportError: return release, version, csd, ptype try: from winreg import OpenKeyEx, QueryValueEx, CloseKey, HKEY_LOCAL_MACHINE except ImportError: from _winreg import OpenKeyEx, QueryValueEx, CloseKey, HKEY_LOCAL_MACHINE winver = getwindowsversion() maj, min, build = _get_real_winver(*winver[:3]) version = '{0}.{1}.{2}'.format(maj, min, build) release = (_WIN32_CLIENT_RELEASES.get((maj, min)) or _WIN32_CLIENT_RELEASES.get((maj, None)) or release) # getwindowsversion() reflect the compatibility mode Python is # running under, and so the service pack value is only going to be # valid if the versions match. if winver[:2] == (maj, min): try: csd = 'SP{}'.format(winver.service_pack_major) except AttributeError: if csd[:13] == 'Service Pack ': csd = 'SP' + csd[13:] # VER_NT_SERVER = 3 if getattr(winver, 'product_type', None) == 3: release = (_WIN32_SERVER_RELEASES.get((maj, min)) or _WIN32_SERVER_RELEASES.get((maj, None)) or release) key = None try: key = OpenKeyEx(HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion') ptype = QueryValueEx(key, 'CurrentType')[0] except: pass finally: if key: CloseKey(key) return release, version, csd, ptype def _mac_ver_lookup(selectors,default=None): from gestalt import gestalt import MacOS l = [] append = l.append for selector in selectors: try: append(gestalt(selector)) except (RuntimeError, MacOS.Error): append(default) return l def _bcd2str(bcd): return hex(bcd)[2:] def _mac_ver_gestalt(): """ Thanks to Mark R. Levinson for mailing documentation links and code examples for this function. Documentation for the gestalt() API is available online at: http://www.rgaros.nl/gestalt/ """ # Check whether the version info module is available try: import gestalt import MacOS except ImportError: return None # Get the infos sysv,sysa = _mac_ver_lookup(('sysv','sysa')) # Decode the infos if sysv: major = (sysv & 0xFF00) >> 8 minor = (sysv & 0x00F0) >> 4 patch = (sysv & 0x000F) if (major, minor) >= (10, 4): # the 'sysv' gestald cannot return patchlevels # higher than 9. Apple introduced 3 new # gestalt codes in 10.4 to deal with this # issue (needed because patch levels can # run higher than 9, such as 10.4.11) major,minor,patch = _mac_ver_lookup(('sys1','sys2','sys3')) release = '%i.%i.%i' %(major, minor, patch) else: release = '%s.%i.%i' % (_bcd2str(major),minor,patch) if sysa: machine = {0x1: '68k', 0x2: 'PowerPC', 0xa: 'i386'}.get(sysa,'') versioninfo=('', '', '') return release,versioninfo,machine def _mac_ver_xml(): fn = '/System/Library/CoreServices/SystemVersion.plist' if not os.path.exists(fn): return None try: import plistlib except ImportError: return None pl = plistlib.readPlist(fn) release = pl['ProductVersion'] versioninfo=('', '', '') machine = os.uname()[4] if machine in ('ppc', 'Power Macintosh'): # for compatibility with the gestalt based code machine = 'PowerPC' return release,versioninfo,machine def mac_ver(release='',versioninfo=('','',''),machine=''): """ Get MacOS version information and return it as tuple (release, versioninfo, machine) with versioninfo being a tuple (version, dev_stage, non_release_version). Entries which cannot be determined are set to the parameter values which default to ''. All tuple entries are strings. """ # First try reading the information from an XML file which should # always be present info = _mac_ver_xml() if info is not None: return info # If that doesn't work for some reason fall back to reading the # information using gestalt calls. info = _mac_ver_gestalt() if info is not None: return info # If that also doesn't work return the default values return release,versioninfo,machine def _java_getprop(name,default): from java.lang import System try: value = System.getProperty(name) if value is None: return default return value except AttributeError: return default def java_ver(release='',vendor='',vminfo=('','',''),osinfo=('','','')): """ Version interface for Jython. Returns a tuple (release,vendor,vminfo,osinfo) with vminfo being a tuple (vm_name,vm_release,vm_vendor) and osinfo being a tuple (os_name,os_version,os_arch). Values which cannot be determined are set to the defaults given as parameters (which all default to ''). """ # Import the needed APIs try: import java.lang except ImportError: return release,vendor,vminfo,osinfo vendor = _java_getprop('java.vendor', vendor) release = _java_getprop('java.version', release) vm_name, vm_release, vm_vendor = vminfo vm_name = _java_getprop('java.vm.name', vm_name) vm_vendor = _java_getprop('java.vm.vendor', vm_vendor) vm_release = _java_getprop('java.vm.version', vm_release) vminfo = vm_name, vm_release, vm_vendor os_name, os_version, os_arch = osinfo os_arch = _java_getprop('java.os.arch', os_arch) os_name = _java_getprop('java.os.name', os_name) os_version = _java_getprop('java.os.version', os_version) osinfo = os_name, os_version, os_arch return release, vendor, vminfo, osinfo ### System name aliasing def system_alias(system,release,version): """ Returns (system,release,version) aliased to common marketing names used for some systems. It also does some reordering of the information in some cases where it would otherwise cause confusion. """ if system == 'Rhapsody': # Apple's BSD derivative # XXX How can we determine the marketing release number ? return 'MacOS X Server',system+release,version elif system == 'SunOS': # Sun's OS if release < '5': # These releases use the old name SunOS return system,release,version # Modify release (marketing release = SunOS release - 3) l = string.split(release,'.') if l: try: major = int(l[0]) except ValueError: pass else: major = major - 3 l[0] = str(major) release = string.join(l,'.') if release < '6': system = 'Solaris' else: # XXX Whatever the new SunOS marketing name is... system = 'Solaris' elif system == 'IRIX64': # IRIX reports IRIX64 on platforms with 64-bit support; yet it # is really a version and not a different platform, since 32-bit # apps are also supported.. system = 'IRIX' if version: version = version + ' (64bit)' else: version = '64bit' elif system in ('win32','win16'): # In case one of the other tricks system = 'Windows' return system,release,version ### Various internal helpers def _platform(*args): """ Helper to format the platform string in a filename compatible format e.g. "system-version-machine". """ # Format the platform string platform = string.join( map(string.strip, filter(len, args)), '-') # Cleanup some possible filename obstacles... replace = string.replace platform = replace(platform,' ','_') platform = replace(platform,'/','-') platform = replace(platform,'\\','-') platform = replace(platform,':','-') platform = replace(platform,';','-') platform = replace(platform,'"','-') platform = replace(platform,'(','-') platform = replace(platform,')','-') # No need to report 'unknown' information... platform = replace(platform,'unknown','') # Fold '--'s and remove trailing '-' while 1: cleaned = replace(platform,'--','-') if cleaned == platform: break platform = cleaned while platform[-1] == '-': platform = platform[:-1] return platform def _node(default=''): """ Helper to determine the node name of this machine. """ try: import socket except ImportError: # No sockets... return default try: return socket.gethostname() except socket.error: # Still not working... return default # os.path.abspath is new in Python 1.5.2: if not hasattr(os.path,'abspath'): def _abspath(path, isabs=os.path.isabs,join=os.path.join,getcwd=os.getcwd, normpath=os.path.normpath): if not isabs(path): path = join(getcwd(), path) return normpath(path) else: _abspath = os.path.abspath def _follow_symlinks(filepath): """ In case filepath is a symlink, follow it until a real file is reached. """ filepath = _abspath(filepath) while os.path.islink(filepath): filepath = os.path.normpath( os.path.join(os.path.dirname(filepath),os.readlink(filepath))) return filepath def _syscmd_uname(option,default=''): """ Interface to the system's uname command. """ if sys.platform in ('dos','win32','win16','os2'): # XXX Others too ? return default try: f = os.popen('uname %s 2> %s' % (option, DEV_NULL)) except (AttributeError,os.error): return default output = string.strip(f.read()) rc = f.close() if not output or rc: return default else: return output def _syscmd_file(target,default=''): """ Interface to the system's file command. The function uses the -b option of the file command to have it ommit the filename in its output and if possible the -L option to have the command follow symlinks. It returns default in case the command should fail. """ # We do the import here to avoid a bootstrap issue. # See c73b90b6dadd changeset. # # [..] # ranlib libpython2.7.a # gcc -o python \ # Modules/python.o \ # libpython2.7.a -lsocket -lnsl -ldl -lm # Traceback (most recent call last): # File "./setup.py", line 8, in <module> # from platform import machine as platform_machine # File "[..]/build/Lib/platform.py", line 116, in <module> # import sys,string,os,re,subprocess # File "[..]/build/Lib/subprocess.py", line 429, in <module> # import select # ImportError: No module named select import subprocess if sys.platform in ('dos','win32','win16','os2'): # XXX Others too ? return default target = _follow_symlinks(target) try: proc = subprocess.Popen(['file', target], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) except (AttributeError,os.error): return default output = proc.communicate()[0] rc = proc.wait() if not output or rc: return default else: return output ### Information about the used architecture # Default values for architecture; non-empty strings override the # defaults given as parameters _default_architecture = { 'win32': ('','WindowsPE'), 'win16': ('','Windows'), 'dos': ('','MSDOS'), } _architecture_split = re.compile(r'[\s,]').split def architecture(executable=sys.executable,bits='',linkage=''): """ Queries the given executable (defaults to the Python interpreter binary) for various architecture information. Returns a tuple (bits,linkage) which contains information about the bit architecture and the linkage format used for the executable. Both values are returned as strings. Values that cannot be determined are returned as given by the parameter presets. If bits is given as '', the sizeof(pointer) (or sizeof(long) on Python version < 1.5.2) is used as indicator for the supported pointer size. The function relies on the system's "file" command to do the actual work. This is available on most if not all Unix platforms. On some non-Unix platforms where the "file" command does not exist and the executable is set to the Python interpreter binary defaults from _default_architecture are used. """ # Use the sizeof(pointer) as default number of bits if nothing # else is given as default. if not bits: import struct try: size = struct.calcsize('P') except struct.error: # Older installations can only query longs size = struct.calcsize('l') bits = str(size*8) + 'bit' # Get data from the 'file' system command if executable: output = _syscmd_file(executable, '') else: output = '' if not output and \ executable == sys.executable: # "file" command did not return anything; we'll try to provide # some sensible defaults then... if sys.platform in _default_architecture: b, l = _default_architecture[sys.platform] if b: bits = b if l: linkage = l return bits, linkage # Split the output into a list of strings omitting the filename fileout = _architecture_split(output)[1:] if 'executable' not in fileout: # Format not supported return bits,linkage # Bits if '32-bit' in fileout: bits = '32bit' elif 'N32' in fileout: # On Irix only bits = 'n32bit' elif '64-bit' in fileout: bits = '64bit' # Linkage if 'ELF' in fileout: linkage = 'ELF' elif 'PE' in fileout: # E.g. Windows uses this format if 'Windows' in fileout: linkage = 'WindowsPE' else: linkage = 'PE' elif 'COFF' in fileout: linkage = 'COFF' elif 'MS-DOS' in fileout: linkage = 'MSDOS' else: # XXX the A.OUT format also falls under this class... pass return bits,linkage ### Portable uname() interface _uname_cache = None def uname(): """ Fairly portable uname interface. Returns a tuple of strings (system,node,release,version,machine,processor) identifying the underlying platform. Note that unlike the os.uname function this also returns possible processor information as an additional tuple entry. Entries which cannot be determined are set to ''. """ global _uname_cache no_os_uname = 0 if _uname_cache is not None: return _uname_cache processor = '' # Get some infos from the builtin os.uname API... try: system,node,release,version,machine = os.uname() except AttributeError: no_os_uname = 1 if no_os_uname or not filter(None, (system, node, release, version, machine)): # Hmm, no there is either no uname or uname has returned #'unknowns'... we'll have to poke around the system then. if no_os_uname: system = sys.platform release = '' version = '' node = _node() machine = '' use_syscmd_ver = 1 # Try win32_ver() on win32 platforms if system == 'win32': release,version,csd,ptype = win32_ver() if release and version: use_syscmd_ver = 0 # Try to use the PROCESSOR_* environment variables # available on Win XP and later; see # http://support.microsoft.com/kb/888731 and # http://www.geocities.com/rick_lively/MANUALS/ENV/MSWIN/PROCESSI.HTM if not machine: # WOW64 processes mask the native architecture if "PROCESSOR_ARCHITEW6432" in os.environ: machine = os.environ.get("PROCESSOR_ARCHITEW6432", '') else: machine = os.environ.get('PROCESSOR_ARCHITECTURE', '') if not processor: processor = os.environ.get('PROCESSOR_IDENTIFIER', machine) # Try the 'ver' system command available on some # platforms if use_syscmd_ver: system,release,version = _syscmd_ver(system) # Normalize system to what win32_ver() normally returns # (_syscmd_ver() tends to return the vendor name as well) if system == 'Microsoft Windows': system = 'Windows' elif system == 'Microsoft' and release == 'Windows': # Under Windows Vista and Windows Server 2008, # Microsoft changed the output of the ver command. The # release is no longer printed. This causes the # system and release to be misidentified. system = 'Windows' if '6.0' == version[:3]: release = 'Vista' else: release = '' # In case we still don't know anything useful, we'll try to # help ourselves if system in ('win32','win16'): if not version: if system == 'win32': version = '32bit' else: version = '16bit' system = 'Windows' elif system[:4] == 'java': release,vendor,vminfo,osinfo = java_ver() system = 'Java' version = string.join(vminfo,', ') if not version: version = vendor # System specific extensions if system == 'OpenVMS': # OpenVMS seems to have release and version mixed up if not release or release == '0': release = version version = '' # Get processor information try: import vms_lib except ImportError: pass else: csid, cpu_number = vms_lib.getsyi('SYI$_CPU',0) if (cpu_number >= 128): processor = 'Alpha' else: processor = 'VAX' if not processor: # Get processor information from the uname system command processor = _syscmd_uname('-p','') #If any unknowns still exist, replace them with ''s, which are more portable if system == 'unknown': system = '' if node == 'unknown': node = '' if release == 'unknown': release = '' if version == 'unknown': version = '' if machine == 'unknown': machine = '' if processor == 'unknown': processor = '' # normalize name if system == 'Microsoft' and release == 'Windows': system = 'Windows' release = 'Vista' _uname_cache = system,node,release,version,machine,processor return _uname_cache ### Direct interfaces to some of the uname() return values def system(): """ Returns the system/OS name, e.g. 'Linux', 'Windows' or 'Java'. An empty string is returned if the value cannot be determined. """ return uname()[0] def node(): """ Returns the computer's network name (which may not be fully qualified) An empty string is returned if the value cannot be determined. """ return uname()[1] def release(): """ Returns the system's release, e.g. '2.2.0' or 'NT' An empty string is returned if the value cannot be determined. """ return uname()[2] def version(): """ Returns the system's release version, e.g. '#3 on degas' An empty string is returned if the value cannot be determined. """ return uname()[3] def machine(): """ Returns the machine type, e.g. 'i386' An empty string is returned if the value cannot be determined. """ return uname()[4] def processor(): """ Returns the (true) processor name, e.g. 'amdk6' An empty string is returned if the value cannot be determined. Note that many platforms do not provide this information or simply return the same value as for machine(), e.g. NetBSD does this. """ return uname()[5] ### Various APIs for extracting information from sys.version _sys_version_parser = re.compile( r'([\w.+]+)\s*' # "version<space>" r'\(#?([^,]+)' # "(#buildno" r'(?:,\s*([\w ]*)' # ", builddate" r'(?:,\s*([\w :]*))?)?\)\s*' # ", buildtime)<space>" r'\[([^\]]+)\]?') # "[compiler]" _ironpython_sys_version_parser = re.compile( r'IronPython\s*' '([\d\.]+)' '(?: \(([\d\.]+)\))?' ' on (.NET [\d\.]+)') # IronPython covering 2.6 and 2.7 _ironpython26_sys_version_parser = re.compile( r'([\d.]+)\s*' '\(IronPython\s*' '[\d.]+\s*' '\(([\d.]+)\) on ([\w.]+ [\d.]+(?: \(\d+-bit\))?)\)' ) _pypy_sys_version_parser = re.compile( r'([\w.+]+)\s*' '\(#?([^,]+),\s*([\w ]+),\s*([\w :]+)\)\s*' '\[PyPy [^\]]+\]?') _sys_version_cache = {} def _sys_version(sys_version=None): """ Returns a parsed version of Python's sys.version as tuple (name, version, branch, revision, buildno, builddate, compiler) referring to the Python implementation name, version, branch, revision, build number, build date/time as string and the compiler identification string. Note that unlike the Python sys.version, the returned value for the Python version will always include the patchlevel (it defaults to '.0'). The function returns empty strings for tuple entries that cannot be determined. sys_version may be given to parse an alternative version string, e.g. if the version was read from a different Python interpreter. """ # Get the Python version if sys_version is None: sys_version = sys.version # Try the cache first result = _sys_version_cache.get(sys_version, None) if result is not None: return result # Parse it if 'IronPython' in sys_version: # IronPython name = 'IronPython' if sys_version.startswith('IronPython'): match = _ironpython_sys_version_parser.match(sys_version) else: match = _ironpython26_sys_version_parser.match(sys_version) if match is None: raise ValueError( 'failed to parse IronPython sys.version: %s' % repr(sys_version)) version, alt_version, compiler = match.groups() buildno = '' builddate = '' elif sys.platform.startswith('java'): # Jython name = 'Jython' match = _sys_version_parser.match(sys_version) if match is None: raise ValueError( 'failed to parse Jython sys.version: %s' % repr(sys_version)) version, buildno, builddate, buildtime, _ = match.groups() if builddate is None: builddate = '' compiler = sys.platform elif "PyPy" in sys_version: # PyPy name = "PyPy" match = _pypy_sys_version_parser.match(sys_version) if match is None: raise ValueError("failed to parse PyPy sys.version: %s" % repr(sys_version)) version, buildno, builddate, buildtime = match.groups() compiler = "" else: # CPython match = _sys_version_parser.match(sys_version) if match is None: raise ValueError( 'failed to parse CPython sys.version: %s' % repr(sys_version)) version, buildno, builddate, buildtime, compiler = \ match.groups() name = 'CPython' if builddate is None: builddate = '' elif buildtime: builddate = builddate + ' ' + buildtime if hasattr(sys, 'subversion'): # sys.subversion was added in Python 2.5 _, branch, revision = sys.subversion else: branch = '' revision = '' # Add the patchlevel version if missing l = string.split(version, '.') if len(l) == 2: l.append('0') version = string.join(l, '.') # Build and cache the result result = (name, version, branch, revision, buildno, builddate, compiler) _sys_version_cache[sys_version] = result return result def python_implementation(): """ Returns a string identifying the Python implementation. Currently, the following implementations are identified: 'CPython' (C implementation of Python), 'IronPython' (.NET implementation of Python), 'Jython' (Java implementation of Python), 'PyPy' (Python implementation of Python). """ return _sys_version()[0] def python_version(): """ Returns the Python version as string 'major.minor.patchlevel' Note that unlike the Python sys.version, the returned value will always include the patchlevel (it defaults to 0). """ return _sys_version()[1] def python_version_tuple(): """ Returns the Python version as tuple (major, minor, patchlevel) of strings. Note that unlike the Python sys.version, the returned value will always include the patchlevel (it defaults to 0). """ return tuple(string.split(_sys_version()[1], '.')) def python_branch(): """ Returns a string identifying the Python implementation branch. For CPython this is the Subversion branch from which the Python binary was built. If not available, an empty string is returned. """ return _sys_version()[2] def python_revision(): """ Returns a string identifying the Python implementation revision. For CPython this is the Subversion revision from which the Python binary was built. If not available, an empty string is returned. """ return _sys_version()[3] def python_build(): """ Returns a tuple (buildno, builddate) stating the Python build number and date as strings. """ return _sys_version()[4:6] def python_compiler(): """ Returns a string identifying the compiler used for compiling Python. """ return _sys_version()[6] ### The Opus Magnum of platform strings :-) _platform_cache = {} def platform(aliased=0, terse=0): """ Returns a single string identifying the underlying platform with as much useful information as possible (but no more :). The output is intended to be human readable rather than machine parseable. It may look different on different platforms and this is intended. If "aliased" is true, the function will use aliases for various platforms that report system names which differ from their common names, e.g. SunOS will be reported as Solaris. The system_alias() function is used to implement this. Setting terse to true causes the function to return only the absolute minimum information needed to identify the platform. """ result = _platform_cache.get((aliased, terse), None) if result is not None: return result # Get uname information and then apply platform specific cosmetics # to it... system,node,release,version,machine,processor = uname() if machine == processor: processor = '' if aliased: system,release,version = system_alias(system,release,version) if system == 'Windows': # MS platforms rel,vers,csd,ptype = win32_ver(version) if terse: platform = _platform(system,release) else: platform = _platform(system,release,version,csd) elif system in ('Linux',): # Linux based systems distname,distversion,distid = dist('') if distname and not terse: platform = _platform(system,release,machine,processor, 'with', distname,distversion,distid) else: # If the distribution name is unknown check for libc vs. glibc libcname,libcversion = libc_ver(sys.executable) platform = _platform(system,release,machine,processor, 'with', libcname+libcversion) elif system == 'Java': # Java platforms r,v,vminfo,(os_name,os_version,os_arch) = java_ver() if terse or not os_name: platform = _platform(system,release,version) else: platform = _platform(system,release,version, 'on', os_name,os_version,os_arch) elif system == 'MacOS': # MacOS platforms if terse: platform = _platform(system,release) else: platform = _platform(system,release,machine) else: # Generic handler if terse: platform = _platform(system,release) else: bits,linkage = architecture(sys.executable) platform = _platform(system,release,machine,processor,bits,linkage) _platform_cache[(aliased, terse)] = platform return platform ### Command line interface if __name__ == '__main__': # Default is to print the aliased verbose platform string terse = ('terse' in sys.argv or '--terse' in sys.argv) aliased = (not 'nonaliased' in sys.argv and not '--nonaliased' in sys.argv) print platform(aliased,terse) sys.exit(0)
Save
cmd:
run