w11

Transkrypt

w11
Wstęp do programowania
Wykład 11 ­ Zaawansowane elementy programowania
Janusz Szwabiński
Plan wykładu:
Obsługa wyjątków
Debugowanie programów
Profilowanie programów
Mieszane strategie programowania
"Opakowywanie" programów
Python i Fortran
Python i C/C++
"Zamrażanie" skryptów
Materiały do wykładu:
The Python Debugger (https://docs.python.org/3/library/pdb.html
(https://docs.python.org/3/library/pdb.html))
The Python Profilers (https://docs.python.org/3/library/profile.html
(https://docs.python.org/3/library/profile.html))
Dokumentacja F2Py (http://docs.scipy.org/doc/numpy­dev/f2py/ (http://docs.scipy.org/doc/numpy­
dev/f2py/))
Ctypes:
https://docs.python.org/3/library/ctypes.html (https://docs.python.org/3/library/ctypes.html)
http://wiki.scipy.org/Cookbook/Ctypes (http://wiki.scipy.org/Cookbook/Ctypes)
Dokumentacja Weave (http://docs.scipy.org/doc/scipy­0.14.0/reference/tutorial/weave.html
(http://docs.scipy.org/doc/scipy­0.14.0/reference/tutorial/weave.html))
Cython (http://cython.org/ (http://cython.org/))
cx_Freeze (http://cx­freeze.sourceforge.net/ (http://cx­freeze.sourceforge.net/))
"Extending and Embedding the Python Interpreter" (https://docs.python.org/3/extending/
(https://docs.python.org/3/extending/))
Simplified Wrapper Interface Generator (SWIG, http://www.swig.org/ (http://www.swig.org/))
Obsługa wyjątków
In [1]:
10*(1/0)
-------------------------------------------------------------------------ZeroDivisionError
Traceback (most recent ca
ll last)
<ipython-input-1-95b156eacec0> in <module>()
----> 1 10*(1/0)
ZeroDivisionError: division by zero
In [2]:
4 + spam*3
-------------------------------------------------------------------------NameError
Traceback (most recent ca
ll last)
<ipython-input-2-6b1dfe582d2e> in <module>()
----> 1 4 + spam*3
NameError: name 'spam' is not defined
In [3]:
'2' + 2
-------------------------------------------------------------------------TypeError
Traceback (most recent ca
ll last)
<ipython-input-3-4c6dd5170204> in <module>()
----> 1 '2' + 2
TypeError: Can't convert 'int' object to str implicitly
In [4]:
import math
math.log10(10.)
Out[4]:
1.0
In [5]:
math.log10(0.)
-------------------------------------------------------------------------ValueError
Traceback (most recent ca
ll last)
<ipython-input-5-09a8f09b1ca2> in <module>()
----> 1 math.log10(0.)
ValueError: math domain error
błędy podczas wykonywania instrukcji składniowo poprawnych
nie wszystkie wymagają przerwania programu
obsługa wyjątków czyni kod bezpieczniejszym
funkcjonalność często niedoceniana przez programistów
Konstrukcja try...except
try:
<instrukcje>
except <wyjątki>:
<instrukcje>
instrukcje między **try** i **except** wykonywane są w pierwszej kolejności
jeśli nie pojawi się żaden wyjątek, klauzula **except** jest pomijana
jeśli podczas wykonywania klauzuli **try** zdarzy się wyjątek, pozostała jej część jest pomijana
jeżeli typ wyjątku pasuje do tych wymienionych w części **except**, wykonywany jest kod w tym
bloku
instrukcja **try** może posiadać kilka bloków **except**
klauzula **except** może zawierać nazwy kilku wyjątków podanych jako krotka
opcjonalnie może pojawić się klauzula **else**
In [6]:
a = -1.0
try:
r = math.log10(a)
except ValueError:
print('Uwaga: wyjście poza zakres.')
print('Biorę wartość 0.')
r=0
Uwaga: wyjście poza zakres.
Biorę wartość 0.
In [7]:
print(r)
0
Konstrukcja **try...except** może zawierać klauzulę **else**. Instrukcje zawarte w bloku **else** są
wykonywane, jeśli nie pojawi się żaden wyjątek:
In [8]:
import sys
arg = 'hello.py'
try:
f = open(arg, 'r')
except IOError:
print('cannot open', arg)
else:
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
hello.py has 3 lines
Konstrukcja try...finally
Polecenie **try** może również kończyć się klauzulą **finally**:
try:
<instrukcje>
finally:
<instrukcje>
Instrukcje w bloku **finally**:
są wykonywane zawsze, niezależnie od tego, czy pojawił się wyjątek, czy też nie,
przydają się do czyszczenia zasobów,
wyjątek jest ponownie rzucany po ich wykonaniu.
In [9]:
def divide(x,y):
try:
result = x/y
except ZeroDivisionError:
print("Dzielenie przez zero!")
else:
print("Wynik: ", result)
finally:
print("Ja tu tylko sprzątam")
divide(2,1)
Wynik: 2.0
Ja tu tylko sprzątam
In [10]:
divide(2,0)
Dzielenie przez zero!
Ja tu tylko sprzątam
In [11]:
divide("2","1")
Ja tu tylko sprzątam
-------------------------------------------------------------------------TypeError
Traceback (most recent ca
ll last)
<ipython-input-11-da42c9ab7899> in <module>()
----> 1 divide("2","1")
<ipython-input-9-46fe07b06540> in divide(x, y)
1 def divide(x,y):
2
try:
----> 3
result = x/y
4
except ZeroDivisionError:
5
print("Dzielenie przez zero!")
TypeError: unsupported operand type(s) for /: 'str' and 'str'
Zgłaszanie wyjątków
Poleceniem **raise** możemy wymusić pojawienie się wyjątku o określonym typie:
In [12]:
raise NameError('Czołem!')
-------------------------------------------------------------------------NameError
Traceback (most recent ca
ll last)
<ipython-input-12-f92af2244681> in <module>()
----> 1 raise NameError('Czołem!')
NameError: Czołem!
Wyjątki zdefiniowane przez użytkownika
Zdefiniowanie nowej klasy wyjątków pozwala na używanie własnych wyjątków w programach:
In [13]:
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
In [14]:
try:
raise MyError(2*2)
except MyError as e:
print("Rzucono mój wyjątek. Wartość: ", e.value)
Rzucono mój wyjątek. Wartość: 4
Obsługa wyjątków kontra wyrażenie warunkowe
In [15]:
%%timeit
import math
for i in range(-1000000,1000000):
if i>0:
math.log10(i)
10 loops, best of 3: 166 ms per loop
In [16]:
%%timeit
import math
for i in range(-1000000,1000000):
try:
math.log10(i)
except:
pass
1 loop, best of 3: 337 ms per loop
Wynik raczej zniechęca do używania try. Jednak w praktyce okazuje się, że są sytuacje, w których try
sprawdza się lepiej od if:
jeżeli spodziewamy się, że ciąg instrukcji w większości przypadków wykona się poprawnie, a
ewentualne błędy związane są z awariami i występują bardzo rzadko, wtedy try może być bardziej
wydajne od if
jeżeli ciąg instrukcji często zwraca "błędną" wartość, wtedy lepiej jest używać if
In [17]:
%%timeit
import math
for i in range(0,1000000):
if i>0:
math.log10(i)
1 loop, best of 3: 135 ms per loop
In [18]:
%%timeit
import math
for i in range(0,1000000):
try:
math.log10(i)
except:
pass
10 loops, best of 3: 120 ms per loop
In [19]:
%%timeit
import math
for i in range(10,1000000):
if i>0:
math.log10(i)
10 loops, best of 3: 138 ms per loop
In [20]:
%%timeit
import math
for i in range(10,1000000):
try:
math.log10(i)
except:
pass
10 loops, best of 3: 122 ms per loop
Debuggowanie programów
Moduł pdb w bibliotece standardowej Pythona oferuje interaktywny debugger. który ułatwia szukanie błędów
w programach. Możliwości pdb są następujące:
ustawianie punktów przerwań (ang. breakpoints)
wykonywanie kodu wiersz po wierszu
kontrola ramek stosu
wyświetlanie kodu źródłowego
wykonywanie dowolnych poleceń pythonowych w obrębie dowolnej ramki stosu
debugowanie "pośmiertne"
może być dowolnie rozbudowywany
Moduł można właczyć w momencie wywołania programu w konsoli:
python3 -m pdb myscript.py
lub z poziomu badanego programu, dodając do niego polecenia
import pdb
pdb.set_trace()
Podstawowe polecenia sterujące debuggera przedstawione sa w poniższej tabeli:
Polecenie Opis
p var
wyświetl zawartość zmiennej var
b linno punkt przerwania w wierszu o numerze linno
b fun
punkt przerwania przy pierwszym wywołaniu funkcji fun
clear
usuwa punkty przerwań
c
kontynuuj program
n
następne polecenie (linia kodu)
s
wejdź w głąb funkcji
l
pokaż miejsce w kodzie programu
q
zakończ debugowanie
Profilowanie programów
technika optymalizacji kodu
pozwala stwierdzić, ile czasu potrzeba na wykonanie poszczególnych części programu
praktyczny sposób na oszacowanie złożoności skomplikowanych algorytmów
Uwaga!
profilować powinniśmy działający program
tworzenie programu od początku z myślą, aby był jak najbardziej wydajny, może znacznie wydłużyć
czas programowania
Kilka "złotych" myśli:
"więcej komputerowych grzechów popełnionych zostało w
imię wydajności niż z każdego innego powodu, włączając
w to czystą głupotę ­­ William A. Wulf
"przedwczesna optymalizacja jest źródłem wszelkiego zła” ­­ C.A.R. Hoare
"najlepszym, najtańszym i często najszybszym sposobem
poprawienia wydajności jest odczekanie kilku miesięcy, aż
pojawi się szybszy sprzęt" ­ E.S. Raymond
W Pythonie znajduje się kilka modułów, które można wykorzystać do profilowania:
profile i cProfile pozwalają na profilowanie całych skryptów
timeit służy do pomiaru czasu wykonywania małych wycinków kodu
Timeit w akcji
Chcemy porównać, czy wyliczanie macierzy odwrotnej w scipy poprzez metodę .I jest równoważne funkcji
inv():
In [21]:
#definiujemy funkcje
import scipy
import scipy.linalg
def test1():
a = scipy.mat('[1 3 5; 2 5 1; 2 3 8]')
a.I
def test2():
a = scipy.mat('[1 3 5; 2 5 1; 2 3 8]')
scipy.linalg.inv(a)
In [22]:
#pomiar czasu wykonania
from timeit import Timer
t1 = Timer("test1()","from __main__ import test1")
print("Pierwszy test: ", t1.repeat(repeat=1,number=10))
t2 = Timer("test2()","from __main__ import test2")
print("Drugi test: ", t2.repeat(repeat=1,number=10))
Pierwszy test: [0.006384490989148617]
Drugi test: [0.004143648082390428]
IPython upraszcza dostęp do modułu timeit:
In [23]:
%timeit test1()
The slowest run took 4.07 times longer than the fastest. This could
mean that an intermediate result is being cached.
10000 loops, best of 3: 136 µs per loop
In [24]:
%timeit test2()
10000 loops, best of 3: 126 µs per loop
Profile
In [25]:
import cProfile
def dottest():
A = scipy.random.random((10000,10000))
B = scipy.random.random((10000,10000))
C = A*B
cProfile.run('dottest()')
6 function calls in 3.362 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(funct
ion)
1
0.581
0.581
3.291
3.291 <ipython-input-25-d02
cf3eadc03>:3(dottest)
1
0.070
0.070
3.362
3.362 <string>:1(<module>)
1
0.000
0.000
3.362
3.362 {built-in method exe
c}
1
0.000
0.000
0.000
0.000 {method 'disable' of
'_lsprof.Profiler' objects}
2
2.710
1.355
2.710
1.355 {method 'random_sampl
e' of 'mtrand.RandomState' objects}
Mieszane strategie programowania
nie ma języka idealnego do wszystkich zastosowań
istnieje wiele nisz, w których jakiś język programowania jest lepszy od pozostałych
zamiast pisać monolityczne programy w językach ogólnego przeznaczenia, czasami lepiej
(wydajniej) jest mieszać języki tak, aby każdy wykonywał to, co potrafi najlepiej
mieszanie języków wymaga wiedzy, ale często znacznie skraca proces tworzenia programu
Ze względu na łatwą integrację z Fortranem i C/C++ Python jest bardzo przydatnym językiem w mieszanych
strategiach programowania. Główne powody stosowania tych strategii w związku z Pythonem to:
wygodniejszy dostęp do istniejących programów
migracja "zasobożernych" części kodu do języków tradycyjnych
Python i Fortran
F2PY
F2Py pozwala skompilować kod napisany w Fortranie do postaci modułu, który następnie można
zaimportować w Pythonie. Pakiet jest częścią NumPy i wymaga zainstalowanego w systemie kompilatora
Fortrana.
Przykład 1 ­ procedura (skalar na wejściu, nie zwraca wartości)
In [26]:
%%file hellofortran.f
C File hellofortran.f
subroutine hellofortran (n)
integer n
100
do 100 i=1, n
print *, "Pozdrowienia od Fortrana"
continue
end
Overwriting hellofortran.f
Tworzymy moduł o nazwie hellofortran przy pomocy f2py (w systemie zainstalowany jest kompilator gfortran):
In [27]:
!f2py3 -c -m hellofortran hellofortran.f
running build
running config_cc
unifing config_cc, config, build_clib, build_ext, build commands -compiler options
running config_fc
unifing config_fc, config, build_clib, build_ext, build commands -fcompiler options
running build_src
build_src
building extension "hellofortran" sources
f2py options: []
f2py:> /tmp/tmps0nwu_ze/src.linux-x86_64-3.4/hellofortranmodule.c
creating /tmp/tmps0nwu_ze/src.linux-x86_64-3.4
Reading fortran codes...
Reading file 'hellofortran.f' (format:fix,strict)
Post-processing...
Block: hellofortran
Block: hellofortran
Post-processing (stage 2)...
Building modules...
Building module "hellofortran"...
Constructing wrapper function "hellofortran"...
hellofortran(n)
Wrote C/API module "hellofortran" to file "/tmp/tmps0nwu_z
e/src.linux-x86_64-3.4/hellofortranmodule.c"
adding '/tmp/tmps0nwu_ze/src.linux-x86_64-3.4/fortranobject.c' to
sources.
adding '/tmp/tmps0nwu_ze/src.linux-x86_64-3.4' to include_dirs.
copying /usr/lib/python3/dist-packages/numpy/f2py/src/fortranobjec
t.c -> /tmp/tmps0nwu_ze/src.linux-x86_64-3.4
copying /usr/lib/python3/dist-packages/numpy/f2py/src/fortranobjec
t.h -> /tmp/tmps0nwu_ze/src.linux-x86_64-3.4
build_src: building npy-pkg config files
running build_ext
customize UnixCCompiler
customize UnixCCompiler using build_ext
customize Gnu95FCompiler
Found executable /usr/bin/gfortran
customize Gnu95FCompiler
customize Gnu95FCompiler using build_ext
building 'hellofortran' extension
compiling C sources
C compiler: x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 Wall -Wstrict-prototypes -g -fstack-protector-strong -Wformat -Werr
or=format-security -D_FORTIFY_SOURCE=2 -fPIC
creating /tmp/tmps0nwu_ze/tmp
creating /tmp/tmps0nwu_ze/tmp/tmps0nwu_ze
creating /tmp/tmps0nwu_ze/tmp/tmps0nwu_ze/src.linux-x86_64-3.4
compile options: '-I/tmp/tmps0nwu_ze/src.linux-x86_64-3.4 -I/usr/li
b/python3/dist-packages/numpy/core/include -I/usr/include/python3.4
m -c'
x86_64-linux-gnu-gcc: /tmp/tmps0nwu_ze/src.linux-x86_64-3.4/hellofo
rtranmodule.c
In file included from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/ndarraytypes.h:1761:0,
from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/ndarrayobject.h:17,
from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/arrayobject.h:4,
from /tmp/tmps0nwu_ze/src.linux-x86_64-3.4/fortran
object.h:13,
from /tmp/tmps0nwu_ze/src.linux-x86_64-3.4/hellofo
rtranmodule.c:17:
/usr/lib/python3/dist-packages/numpy/core/include/numpy/npy_1_7_dep
recated_api.h:15:2: warning: #warning "Using deprecated NumPy API,
disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSI
ON" [-Wcpp]
#warning "Using deprecated NumPy API, disable it by " \
^
x86_64-linux-gnu-gcc: /tmp/tmps0nwu_ze/src.linux-x86_64-3.4/fortran
object.c
In file included from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/ndarraytypes.h:1761:0,
from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/ndarrayobject.h:17,
from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/arrayobject.h:4,
from /tmp/tmps0nwu_ze/src.linux-x86_64-3.4/fortran
object.h:13,
from /tmp/tmps0nwu_ze/src.linux-x86_64-3.4/fortran
object.c:2:
/usr/lib/python3/dist-packages/numpy/core/include/numpy/npy_1_7_dep
recated_api.h:15:2: warning: #warning "Using deprecated NumPy API,
disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSI
ON" [-Wcpp]
#warning "Using deprecated NumPy API, disable it by " \
^
compiling Fortran sources
Fortran f77 compiler: /usr/bin/gfortran -Wall -ffixed-form -fno-sec
ond-underscore -fPIC -O3 -funroll-loops
Fortran f90 compiler: /usr/bin/gfortran -Wall -fno-second-underscor
e -fPIC -O3 -funroll-loops
Fortran fix compiler: /usr/bin/gfortran -Wall -ffixed-form -fno-sec
ond-underscore -Wall -fno-second-underscore -fPIC -O3 -funroll-loop
s
compile options: '-I/tmp/tmps0nwu_ze/src.linux-x86_64-3.4 -I/usr/li
b/python3/dist-packages/numpy/core/include -I/usr/include/python3.4
m -c'
gfortran:f77: hellofortran.f
/usr/bin/gfortran -Wall -Wall -shared /tmp/tmps0nwu_ze/tmp/tmps0nwu
_ze/src.linux-x86_64-3.4/hellofortranmodule.o /tmp/tmps0nwu_ze/tmp/
tmps0nwu_ze/src.linux-x86_64-3.4/fortranobject.o /tmp/tmps0nwu_ze/h
ellofortran.o -lgfortran -o ./hellofortran.cpython-34m.so
Removing build directory /tmp/tmps0nwu_ze
Przykład użycia modułu:
In [28]:
%%file hello.py
import hellofortran
hellofortran.hellofortran(4)
Overwriting hello.py
In [29]:
# run the script
!python3 hello.py
Pozdrowienia od Fortrana
Pozdrowienia od Fortrana
Pozdrowienia od Fortrana
Pozdrowienia od Fortrana
Przykład 2 ­ iloczyn elementów wektora (wektor na wejściu, liczba na wyjściu)
In [30]:
%%file dprod.f
subroutine dprod(x, y, n)
double precision x(n), y
y = 1.0
100
do 100 i=1, n
y = y * x(i)
continue
end
Overwriting dprod.f
In [31]:
!rm -f dprod.pyf
!f2py3 -m dprod -h dprod.pyf dprod.f
Reading fortran codes...
Reading file 'dprod.f' (format:fix,strict)
Post-processing...
Block: dprod
{}
In: :dprod:dprod.f:dprod
vars2fortran: No typespec for argument "n".
Block: dprod
Post-processing (stage 2)...
Saving signatures to file "./dprod.pyf"
f2py wygenerował plik z deklaracją modułu o nazwie dprod.pyf:
In [32]:
!cat dprod.pyf
!
-*- f90 -*! Note: the context of this file is case sensitive.
python module dprod ! in
interface ! in :dprod
subroutine dprod(x,y,n) ! in :dprod:dprod.f
double precision dimension(n) :: x
double precision :: y
integer, optional,check(len(x)>=n),depend(x) :: n=len
(x)
end subroutine dprod
end interface
end python module dprod
! This file was auto-generated with f2py (version:2).
! See http://cens.ioc.ee/projects/f2py2e/
Powinniśmy wyedytować ten plik i wskazać, które ze zmiennych są danymi wejściowymi (intent(in)), a
które wyjściowymi (intent(out)):
In [33]:
%%file dprod.pyf
python module dprod ! in
interface ! in :dprod
subroutine dprod(x,y,n) ! in :dprod:dprod.f
double precision dimension(n), intent(in) :: x
double precision, intent(out) :: y
integer, optional,check(len(x)>=n),depend(x),intent(in) :: n=len(x)
end subroutine dprod
end interface
end python module dprod
Overwriting dprod.pyf
Po zapisaniu zmian kompilujemy moduł:
In [34]:
!f2py3 -c dprod.pyf dprod.f
running build
running config_cc
unifing config_cc, config, build_clib, build_ext, build commands -compiler options
running config_fc
unifing config_fc, config, build_clib, build_ext, build commands -fcompiler options
running build_src
build_src
building extension "dprod" sources
creating /tmp/tmpuf0n3xt2/src.linux-x86_64-3.4
f2py options: []
f2py: dprod.pyf
Reading fortran codes...
Reading file 'dprod.pyf' (format:free)
Post-processing...
Block: dprod
Block: dprod
Post-processing (stage 2)...
Building modules...
Building module "dprod"...
Constructing wrapper function "dprod"...
y = dprod(x,[n])
Wrote C/API module "dprod" to file "/tmp/tmpuf0n3xt2/src.li
nux-x86_64-3.4/dprodmodule.c"
adding '/tmp/tmpuf0n3xt2/src.linux-x86_64-3.4/fortranobject.c' to
sources.
adding '/tmp/tmpuf0n3xt2/src.linux-x86_64-3.4' to include_dirs.
copying /usr/lib/python3/dist-packages/numpy/f2py/src/fortranobjec
t.c -> /tmp/tmpuf0n3xt2/src.linux-x86_64-3.4
copying /usr/lib/python3/dist-packages/numpy/f2py/src/fortranobjec
t.h -> /tmp/tmpuf0n3xt2/src.linux-x86_64-3.4
build_src: building npy-pkg config files
running build_ext
customize UnixCCompiler
customize UnixCCompiler using build_ext
customize Gnu95FCompiler
Found executable /usr/bin/gfortran
customize Gnu95FCompiler
customize Gnu95FCompiler using build_ext
building 'dprod' extension
compiling C sources
C compiler: x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 Wall -Wstrict-prototypes -g -fstack-protector-strong -Wformat -Werr
or=format-security -D_FORTIFY_SOURCE=2 -fPIC
creating /tmp/tmpuf0n3xt2/tmp
creating /tmp/tmpuf0n3xt2/tmp/tmpuf0n3xt2
creating /tmp/tmpuf0n3xt2/tmp/tmpuf0n3xt2/src.linux-x86_64-3.4
compile options: '-I/tmp/tmpuf0n3xt2/src.linux-x86_64-3.4 -I/usr/li
b/python3/dist-packages/numpy/core/include -I/usr/include/python3.4
m -c'
x86_64-linux-gnu-gcc: /tmp/tmpuf0n3xt2/src.linux-x86_64-3.4/dprodmo
dule.c
In file included from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/ndarraytypes.h:1761:0,
from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/ndarrayobject.h:17,
from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/arrayobject.h:4,
from /tmp/tmpuf0n3xt2/src.linux-x86_64-3.4/fortran
object.h:13,
from /tmp/tmpuf0n3xt2/src.linux-x86_64-3.4/dprodmo
dule.c:18:
/usr/lib/python3/dist-packages/numpy/core/include/numpy/npy_1_7_dep
recated_api.h:15:2: warning: #warning "Using deprecated NumPy API,
disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSI
ON" [-Wcpp]
#warning "Using deprecated NumPy API, disable it by " \
^
/tmp/tmpuf0n3xt2/src.linux-x86_64-3.4/dprodmodule.c:111:12: warnin
g: ‘f2py_size’ defined but not used [-Wunused-function]
static int f2py_size(PyArrayObject* var, ...)
^
x86_64-linux-gnu-gcc: /tmp/tmpuf0n3xt2/src.linux-x86_64-3.4/fortran
object.c
In file included from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/ndarraytypes.h:1761:0,
from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/ndarrayobject.h:17,
from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/arrayobject.h:4,
from /tmp/tmpuf0n3xt2/src.linux-x86_64-3.4/fortran
object.h:13,
from /tmp/tmpuf0n3xt2/src.linux-x86_64-3.4/fortran
object.c:2:
/usr/lib/python3/dist-packages/numpy/core/include/numpy/npy_1_7_dep
recated_api.h:15:2: warning: #warning "Using deprecated NumPy API,
disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSI
ON" [-Wcpp]
#warning "Using deprecated NumPy API, disable it by " \
^
compiling Fortran sources
Fortran f77 compiler: /usr/bin/gfortran -Wall -ffixed-form -fno-sec
ond-underscore -fPIC -O3 -funroll-loops
Fortran f90 compiler: /usr/bin/gfortran -Wall -fno-second-underscor
e -fPIC -O3 -funroll-loops
Fortran fix compiler: /usr/bin/gfortran -Wall -ffixed-form -fno-sec
ond-underscore -Wall -fno-second-underscore -fPIC -O3 -funroll-loop
s
compile options: '-I/tmp/tmpuf0n3xt2/src.linux-x86_64-3.4 -I/usr/li
b/python3/dist-packages/numpy/core/include -I/usr/include/python3.4
m -c'
gfortran:f77: dprod.f
/usr/bin/gfortran -Wall -Wall -shared /tmp/tmpuf0n3xt2/tmp/tmpuf0n3
xt2/src.linux-x86_64-3.4/dprodmodule.o /tmp/tmpuf0n3xt2/tmp/tmpuf0n
3xt2/src.linux-x86_64-3.4/fortranobject.o /tmp/tmpuf0n3xt2/dprod.o
-lgfortran -o ./dprod.cpython-34m.so
Removing build directory /tmp/tmpuf0n3xt2
Użycie z poziomu Pythona:
In [35]:
import dprod
from numpy import *
In [36]:
help(dprod)
Help on module dprod:
NAME
dprod
DESCRIPTION
This module 'dprod' is auto-generated with f2py (version:2).
Functions:
y = dprod(x,n=len(x))
.
DATA
dprod = <fortran object>
VERSION
b'$Revision: $'
FILE
/home/szwabin/Dropbox/Zajecia/WstepDoProgramowania/11_adv/dpro
d.cpython-34m.so
In [37]:
a = range(1,50)
dprod.dprod(a)
Out[37]:
6.082818640342675e+62
To samo możemy oczywiście obliczyć przy pomocy funkcji prod z modułu numpy:
In [39]:
prod(arange(1.0,50.0))
Out[39]:
6.0828186403426752e+62
In [40]:
#a teraz tylko 5 pierwszych elementów
dprod.dprod(arange(1,10), 5)
Out[40]:
120.0
Porównajmy wydajności:
In [41]:
xvec = random.rand(500)
In [42]:
%timeit dprod.dprod(xvec)
The slowest run took 9.70 times longer than the fastest. This could
mean that an intermediate result is being cached.
1000000 loops, best of 3: 808 ns per loop
In [43]:
%timeit xvec.prod()
The slowest run took 15.28 times longer than the fastest. This coul
d mean that an intermediate result is being cached.
100000 loops, best of 3: 5.27 µs per loop
Przykład 3 ­ sumy skumulowane (wektor na wejściu, wektor na wyjściu)
In [44]:
# to nie będzie wydajne,
# bo pętle w Pythonie są wolne!
def py_dcumsum(a):
b = empty_like(a)
b[0] = a[0]
for n in range(1,len(a)):
b[n] = b[n-1]+a[n]
return b
A teraz to samo w Fortranie. Tym razem wskazujemy od razu, która ze zmiennych jest zmienną wejściową, a
która wyjściową:
In [45]:
%%file dcumsum.f
c File dcumsum.f
subroutine dcumsum(a, b, n)
double precision a(n)
double precision b(n)
integer n
cf2py intent(in) :: a
cf2py intent(out) :: b
cf2py intent(hide) :: n
100
b(1) = a(1)
do 100 i=2, n
b(i) = b(i-1) + a(i)
continue
end
Overwriting dcumsum.f
Ponieważ teraz nie musimy edytować pliku pyf, kompilujemy moduł od razu:
In [46]:
!f2py3 -c dcumsum.f -m dcumsum
running build
running config_cc
unifing config_cc, config, build_clib, build_ext, build commands -compiler options
running config_fc
unifing config_fc, config, build_clib, build_ext, build commands -fcompiler options
running build_src
build_src
building extension "dcumsum" sources
f2py options: []
f2py:> /tmp/tmp6a2qsf1y/src.linux-x86_64-3.4/dcumsummodule.c
creating /tmp/tmp6a2qsf1y/src.linux-x86_64-3.4
Reading fortran codes...
Reading file 'dcumsum.f' (format:fix,strict)
Post-processing...
Block: dcumsum
Block: dcumsum
Post-processing (stage 2)...
Building modules...
Building module "dcumsum"...
Constructing wrapper function "dcumsum"...
b = dcumsum(a)
Wrote C/API module "dcumsum" to file "/tmp/tmp6a2qsf1y/src.
linux-x86_64-3.4/dcumsummodule.c"
adding '/tmp/tmp6a2qsf1y/src.linux-x86_64-3.4/fortranobject.c' to
sources.
adding '/tmp/tmp6a2qsf1y/src.linux-x86_64-3.4' to include_dirs.
copying /usr/lib/python3/dist-packages/numpy/f2py/src/fortranobjec
t.c -> /tmp/tmp6a2qsf1y/src.linux-x86_64-3.4
copying /usr/lib/python3/dist-packages/numpy/f2py/src/fortranobjec
t.h -> /tmp/tmp6a2qsf1y/src.linux-x86_64-3.4
build_src: building npy-pkg config files
running build_ext
customize UnixCCompiler
customize UnixCCompiler using build_ext
customize Gnu95FCompiler
Found executable /usr/bin/gfortran
customize Gnu95FCompiler
customize Gnu95FCompiler using build_ext
building 'dcumsum' extension
compiling C sources
C compiler: x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 Wall -Wstrict-prototypes -g -fstack-protector-strong -Wformat -Werr
or=format-security -D_FORTIFY_SOURCE=2 -fPIC
creating /tmp/tmp6a2qsf1y/tmp
creating /tmp/tmp6a2qsf1y/tmp/tmp6a2qsf1y
creating /tmp/tmp6a2qsf1y/tmp/tmp6a2qsf1y/src.linux-x86_64-3.4
compile options: '-I/tmp/tmp6a2qsf1y/src.linux-x86_64-3.4 -I/usr/li
b/python3/dist-packages/numpy/core/include -I/usr/include/python3.4
m -c'
x86_64-linux-gnu-gcc: /tmp/tmp6a2qsf1y/src.linux-x86_64-3.4/fortran
object.c
In file included from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/ndarraytypes.h:1761:0,
from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/ndarrayobject.h:17,
from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/arrayobject.h:4,
from /tmp/tmp6a2qsf1y/src.linux-x86_64-3.4/fortran
object.h:13,
from /tmp/tmp6a2qsf1y/src.linux-x86_64-3.4/fortran
object.c:2:
/usr/lib/python3/dist-packages/numpy/core/include/numpy/npy_1_7_dep
recated_api.h:15:2: warning: #warning "Using deprecated NumPy API,
disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSI
ON" [-Wcpp]
#warning "Using deprecated NumPy API, disable it by " \
^
x86_64-linux-gnu-gcc: /tmp/tmp6a2qsf1y/src.linux-x86_64-3.4/dcumsum
module.c
In file included from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/ndarraytypes.h:1761:0,
from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/ndarrayobject.h:17,
from /usr/lib/python3/dist-packages/numpy/core/inc
lude/numpy/arrayobject.h:4,
from /tmp/tmp6a2qsf1y/src.linux-x86_64-3.4/fortran
object.h:13,
from /tmp/tmp6a2qsf1y/src.linux-x86_64-3.4/dcumsum
module.c:18:
/usr/lib/python3/dist-packages/numpy/core/include/numpy/npy_1_7_dep
recated_api.h:15:2: warning: #warning "Using deprecated NumPy API,
disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSI
ON" [-Wcpp]
#warning "Using deprecated NumPy API, disable it by " \
^
/tmp/tmp6a2qsf1y/src.linux-x86_64-3.4/dcumsummodule.c:111:12: warni
ng: ‘f2py_size’ defined but not used [-Wunused-function]
static int f2py_size(PyArrayObject* var, ...)
^
compiling Fortran sources
Fortran f77 compiler: /usr/bin/gfortran -Wall -ffixed-form -fno-sec
ond-underscore -fPIC -O3 -funroll-loops
Fortran f90 compiler: /usr/bin/gfortran -Wall -fno-second-underscor
e -fPIC -O3 -funroll-loops
Fortran fix compiler: /usr/bin/gfortran -Wall -ffixed-form -fno-sec
ond-underscore -Wall -fno-second-underscore -fPIC -O3 -funroll-loop
s
compile options: '-I/tmp/tmp6a2qsf1y/src.linux-x86_64-3.4 -I/usr/li
b/python3/dist-packages/numpy/core/include -I/usr/include/python3.4
m -c'
gfortran:f77: dcumsum.f
/usr/bin/gfortran -Wall -Wall -shared /tmp/tmp6a2qsf1y/tmp/tmp6a2qs
f1y/src.linux-x86_64-3.4/dcumsummodule.o /tmp/tmp6a2qsf1y/tmp/tmp6a
2qsf1y/src.linux-x86_64-3.4/fortranobject.o /tmp/tmp6a2qsf1y/dcumsu
m.o -lgfortran -o ./dcumsum.cpython-34m.so
Removing build directory /tmp/tmp6a2qsf1y
In [47]:
import dcumsum
In [48]:
a = array([1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0])
In [49]:
py_dcumsum(a)
Out[49]:
array([ 1.,
3.,
6., 10., 15., 21., 28., 36.])
In [50]:
dcumsum.dcumsum(a)
Out[50]:
array([ 1.,
3.,
6., 10., 15., 21., 28., 36.])
In [51]:
#funkcja w numpy
cumsum(a)
Out[51]:
array([ 1.,
3.,
6., 10., 15., 21., 28., 36.])
Porównanie wydajności:
In [52]:
a = random.rand(10000)
In [53]:
%timeit py_dcumsum(a)
100 loops, best of 3: 4.37 ms per loop
In [54]:
%timeit dcumsum.dcumsum(a)
The slowest run took 4.56 times longer than the fastest. This could
mean that an intermediate result is being cached.
100000 loops, best of 3: 10.6 µs per loop
In [55]:
%timeit a.cumsum()
The slowest run took 7.76 times longer than the fastest. This could
mean that an intermediate result is being cached.
10000 loops, best of 3: 25.8 µs per loop
Python i C/C++
ctypes
ctypes to biblioteka pozwalająca na używanie kodu napisanego w C z poziomu Pythona. Użycie modułu
skompilowanego w C wymaga od programisty trochę więcej pracy, niż w przypadku f2py:
In [56]:
%%file functions.c
#include <stdio.h>
void hello(int n);
double dprod(double *x, int n);
void dcumsum(double *a, double *b, int n);
void
hello(int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("Pozdrowienia od C\n");
}
}
double
dprod(double *x, int n)
{
int i;
double y = 1.0;
for (i = 0; i < n; i++)
{
y *= x[i];
}
return y;
}
void
dcumsum(double *a, double *b, int n)
{
int i;
b[0] = a[0];
for (i = 1; i < n; i++)
{
b[i] = a[i] + b[i-1];
}
}
Overwriting functions.c
Kompilujemy powyższy program do biblioteki współdzielonej:
In [57]:
!gcc -c -Wall -O2 -Wall -ansi -pedantic -fPIC -o functions.o functions.c
!gcc -o libfunctions.so -shared functions.o
Sprawdźmy wynik:
In [58]:
!file libfunctions.so
libfunctions.so: ELF 64-bit LSB shared object, x86-64, version 1 (S
YSV), dynamically linked, BuildID[sha1]=9483fa26273323b6e32f530264e
0e2b1b7fdf6db, not stripped
Pakiet ctypes wymaga od nas napisania funkcji opakowujących tę bibliotekę:
In [59]:
%%file functions.py
import numpy
import ctypes
_libfunctions = numpy.ctypeslib.load_library('libfunctions', '.')
_libfunctions.hello.argtypes = [ctypes.c_int]
_libfunctions.hello.restype = ctypes.c_void_p
_libfunctions.dprod.argtypes = [numpy.ctypeslib.ndpointer(dtype=numpy.float), ct
ypes.c_int]
_libfunctions.dprod.restype = ctypes.c_double
_libfunctions.dcumsum.argtypes = [numpy.ctypeslib.ndpointer(dtype=numpy.float),
numpy.ctypeslib.ndpointer(dtype=numpy.float), ctypes.c_int]
_libfunctions.dcumsum.restype = ctypes.c_void_p
def hello(n):
return _libfunctions.hello(int(n))
def dprod(x, n=None):
if n is None:
n = len(x)
x = numpy.asarray(x, dtype=numpy.float)
return _libfunctions.dprod(x, int(n))
def dcumsum(a, n):
a = numpy.asarray(a, dtype=numpy.float)
b = numpy.empty(len(a), dtype=numpy.float)
_libfunctions.dcumsum(a, b, int(n))
return b
Overwriting functions.py
In [60]:
%%file run_hello_c.py
import functions
functions.hello(3)
Overwriting run_hello_c.py
In [61]:
!python run_hello_c.py
Pozdrowienia od C
Pozdrowienia od C
Pozdrowienia od C
In [62]:
import functions
Iloczyn elementów wektora:
In [63]:
functions.dprod([1,2,3,4,5])
Out[63]:
120.0
Sumy skumulowane:
In [64]:
a = random.rand(100000)
In [65]:
res_c = functions.dcumsum(a, len(a))
In [66]:
res_fortran = dcumsum.dcumsum(a)
In [67]:
res_c - res_fortran
Out[67]:
array([ 0., 0., 0., ..., 0., 0., 0.])
Porównanie wydajności:
In [68]:
%timeit functions.dcumsum(a, len(a)) #wersja C
1000 loops, best of 3: 261 µs per loop
In [69]:
%timeit dcumsum.dcumsum(a) # Fortran
10000 loops, best of 3: 109 µs per loop
In [70]:
%timeit a.cumsum() # NumPy
1000 loops, best of 3: 242 µs per loop
Cython
Cython to hybryda Pythona i C, umożliwiająca deklarację typów zmiennych i atrybutów klas oraz
wywoływanie funkcji języka C. Kod źródłowy jest kompilowany.
In [71]:
%%file cy_dcumsum.pyx
# -*- coding: utf-8 -*cimport numpy
def dcumsum(numpy.ndarray[numpy.float64_t, ndim=1] a, numpy.ndarray[numpy.float6
4_t, ndim=1] b):
cdef int i, n = len(a)
b[0] = a[0]
for i from 1 <= i < n:
b[i] = b[i-1] + a[i]
return b
Overwriting cy_dcumsum.pyx
Aby skompilować powyższą procedurę, musimy stworzyć plik setup.py o następującej zawartości:
In [72]:
%%file setup.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
from Cython.Build import cythonize
setup(
#cmdclass = {'build_ext': build_ext},
ext_modules = cythonize([Extension("cy_dcumsum", ["cy_dcumsum.pyx"])])
)
Overwriting setup.py
In [73]:
!python3 setup.py build_ext --inplace
Compiling cy_dcumsum.pyx because it changed.
[1/1] Cythonizing cy_dcumsum.pyx
running build_ext
building 'cy_dcumsum' extension
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstric
t-prototypes -g -fstack-protector-strong -Wformat -Werror=format-se
curity -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.4m -c cy_dc
umsum.c -o build/temp.linux-x86_64-3.4/cy_dcumsum.o
In file included from /usr/include/python3.4m/numpy/ndarraytypes.h:
1761:0,
from /usr/include/python3.4m/numpy/ndarrayobject.
h:17,
from
/usr/include/python3.4m/numpy/arrayobject.h:4,
from cy_dcumsum.c:250:
/usr/include/python3.4m/numpy/npy_1_7_deprecated_api.h:15:2: warnin
g: #warning "Using deprecated NumPy API, disable it by " "#defining
NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp]
#warning "Using deprecated NumPy API, disable it by " \
^
In file included from /usr/include/python3.4m/numpy/ndarrayobject.
h:26:0,
from
/usr/include/python3.4m/numpy/arrayobject.h:4,
from cy_dcumsum.c:250:
/usr/include/python3.4m/numpy/__multiarray_api.h:1629:1: warning:
‘_import_array’ defined but not used [-Wunused-function]
_import_array(void)
^
In file included from /usr/include/python3.4m/numpy/ufuncobject.h:3
27:0,
from cy_dcumsum.c:251:
/usr/include/python3.4m/numpy/__ufunc_api.h:241:1: warning: ‘_impor
t_umath’ defined but not used [-Wunused-function]
_import_umath(void)
^
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functi
ons -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions
-Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-s
ecurity -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.4/cy_dcumsum.
o -o /home/szwabin/Dropbox/Zajecia/WstepDoProgramowania/11_adv/cy_d
cumsum.cpython-34m.so
In [74]:
import cy_dcumsum
In [75]:
a = array([1,2,3,4], dtype=float)
b = empty_like(a)
cy_dcumsum.dcumsum(a,b)
b
Out[75]:
array([ 1.,
3.,
6., 10.])
In [76]:
a = array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0])
In [77]:
b = empty_like(a)
cy_dcumsum.dcumsum(a, b)
b
Out[77]:
array([ 1.,
3.,
6., 10., 15., 21., 28., 36.])
3.,
6., 10., 15., 21., 28., 36.])
In [78]:
py_dcumsum(a)
Out[78]:
array([ 1.,
In [79]:
a = random.rand(100000)
b = empty_like(a)
In [80]:
%timeit py_dcumsum(a)
10 loops, best of 3: 43.7 ms per loop
In [81]:
%timeit cy_dcumsum.dcumsum(a,b)
1000 loops, best of 3: 246 µs per loop
"Zamrażanie" skryptów
Dysponując gotowym programem w Pythonie staniemy przed problemem jego dystrybucji. Można udostępnić
sam skrypt, jednak trzeba zdawać sobie sprawę ze specyfiki takiego rozwiązania:
mały rozmiar przesyłanego kodu
potencjalny użytkownik musi mieć zainstalowanego Pythona ze wszystkimi wymaganymi
rozszerzeniami
doinstalowanie wszystkich potrzebnych elementów może odstraszyć początkujących (zwłaszcza
przy "niefortunnym" wyborze systemu operacyjnego :))...
... i zniechęcić tych bardziej zaawansowanych
Dlatego czasami lepiej jest dystrybuować programy w postaci wykonywalnych binariów:
nie wymagają Pythona i rozszerzeń u użytkownika końcowego
dają się łatwo uruchomić lub zainstalować
do pewnego stopnia chronią kod źródłowy
jednak wynikowe pliki są znacznie większe od skryptów, z których zostały stworzone.
Dostępne narzędzia do "zamrażania":
cx_Freeze (http://cx­freeze.sourceforge.net/ (http://cx­freeze.sourceforge.net/))
dla różnych platform
PyInstaller
dla różnych platform
py2exe (http://www.py2exe.org/ (http://www.py2exe.org/))
MS Windows
py2app (http://pythonhosted.org/py2app/ (http://pythonhosted.org/py2app/))
Mac OS
podobny do py2exe
Studium przypadku ­ cx_Freeze
In [84]:
%%writefile progs/ball/ball.py
# -*- coding: utf-8 -*from Tkinter import *
import string
class Demo(Frame):
def createWidgets(self):
#przycisk "Koniec"
self.QUIT = Button(self, text='KONIEC', foreground='red',
command=self.quit)
self.QUIT.pack(side=LEFT, fill=BOTH)
# Scena
self.draw = Canvas(self, width="5i", height="5i")
# Kontrola prędkości
self.speed = Scale(self, orient=HORIZONTAL, label=u"Prędkość piłki",
from_=-100, to=100)
self.speed.pack(side=BOTTOM, fill=X)
# Piłka
self.ball = self.draw.create_oval("0i", "0i", "0.10i", "0.10i",
fill="red")
self.x = 0.05
self.y = 0.05
self.velocity_x = 0.3
self.velocity_y = 0.5
self.draw.pack(side=LEFT)
def moveBall(self, *args):
#zmień prędkośc na przeciwną na brzegach canvas
if (self.x > 5.0) or (self.x < 0.0):
self.velocity_x = -1.0 * self.velocity_x
if (self.y > 5.0) or (self.y < 0.0):
self.velocity_y = -1.0 * self.velocity_y
#zmiana położenia odpowiadajacą prędkości
deltax = (self.velocity_x * self.speed.get() / 100.0)
deltay = (self.velocity_y * self.speed.get() / 100.0)
self.x = self.x + deltax
self.y = self.y + deltay
#rysowanie piłki
self.draw.move(self.ball, "%ri" % deltax, "%ri" % deltay)
self.after(10, self.moveBall)
def __init__(self, master=None):
Frame.__init__(self, master)
Pack.config(self)
self.createWidgets()
self.after(10, self.moveBall)
demo = Demo()
demo.mainloop()
Overwriting progs/ball/ball.py
In [85]:
!python progs/ball/ball.py
In [87]:
!ls -lh progs/ball/
razem 8,0K
-rwxrwxr-x 1 szwabin szwabin 1,7K wrz 14 15:10 ball.py
In [89]:
%%bash
cd progs/ball
cxfreeze ball.py --target-dir dist
creating directory dist
copying /usr/lib/pymodules/python2.7/cx_Freeze/bases/Console -> dis
t/ball
copying /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 -> dist/libpy
thon2.7.so.1.0
writing zip file dist/ball
Name
File
------m FixTk
/usr/lib/python2.7/lib-tk/FixTk.py
m StringIO
m Tkconstants
/usr/lib/python2.7/lib-tk/Tkconstants.p
y
m Tkinter
/usr/lib/python2.7/lib-tk/Tkinter.py
m UserDict
m __builtin__
m __main__
ball.py
m _abcoll
m _codecs
m _codecs_cn
/usr/lib/python2.7/lib-dynload/_codecs_
cn.x86_64-linux-gnu.so
m _codecs_hk
/usr/lib/python2.7/lib-dynload/_codecs_
hk.x86_64-linux-gnu.so
m _codecs_iso2022
/usr/lib/python2.7/lib-dynload/_codecs_
iso2022.x86_64-linux-gnu.so
m _codecs_jp
/usr/lib/python2.7/lib-dynload/_codecs_
jp.x86_64-linux-gnu.so
m _codecs_kr
/usr/lib/python2.7/lib-dynload/_codecs_
kr.x86_64-linux-gnu.so
m _codecs_tw
/usr/lib/python2.7/lib-dynload/_codecs_
tw.x86_64-linux-gnu.so
m _ctypes
/usr/lib/python2.7/lib-dynload/_ctypes.
x86_64-linux-gnu.so
m _locale
m _multibytecodec
/usr/lib/python2.7/lib-dynload/_multiby
tecodec.x86_64-linux-gnu.so
m _sre
m _struct
m _tkinter
/usr/lib/python2.7/lib-dynload/_tkinte
r.so
m _warnings
m _weakref
m _weakrefset
m abc
m array
m base64
m binascii
m bz2
/usr/lib/python2.7/lib-dynload/bz2.x86_
64-linux-gnu.so
m codecs
m copy
m copy_reg
P ctypes
/usr/lib/python2.7/ctypes/__init__.py
m ctypes._endian
/usr/lib/python2.7/ctypes/_endian.py
m cx_Freeze__init__
/usr/lib/pymodules/python2.7/cx_Freeze/
initscripts/Console.py
P encodings
m encodings.aliases
m encodings.ascii
m encodings.base64_codec
m encodings.big5
m encodings.big5hkscs
m encodings.bz2_codec
m encodings.charmap
m encodings.cp037
m encodings.cp1006
m encodings.cp1026
m encodings.cp1140
m encodings.cp1250
m encodings.cp1251
m encodings.cp1252
m encodings.cp1253
m encodings.cp1254
m encodings.cp1255
m encodings.cp1256
m encodings.cp1257
m encodings.cp1258
m encodings.cp424
m encodings.cp437
m encodings.cp500
m encodings.cp720
m encodings.cp737
m encodings.cp775
m encodings.cp850
m encodings.cp852
m encodings.cp855
m encodings.cp856
m encodings.cp857
m encodings.cp858
m encodings.cp860
m encodings.cp861
m encodings.cp862
m encodings.cp863
m encodings.cp864
m encodings.cp865
m encodings.cp866
m encodings.cp869
m encodings.cp874
m encodings.cp875
m encodings.cp932
m encodings.cp949
m encodings.cp950
m encodings.euc_jis_2004
m encodings.euc_jisx0213
m encodings.euc_jp
m encodings.euc_kr
m encodings.gb18030
m encodings.gb2312
m encodings.gbk
m encodings.hex_codec
m encodings.hp_roman8
m encodings.hz
m encodings.idna
m encodings.iso2022_jp
m encodings.iso2022_jp_1
m encodings.iso2022_jp_2
m encodings.iso2022_jp_2004
m encodings.iso2022_jp_3
m encodings.iso2022_jp_ext
m encodings.iso2022_kr
m encodings.iso8859_1
m encodings.iso8859_10
m encodings.iso8859_11
m encodings.iso8859_13
m encodings.iso8859_14
m encodings.iso8859_15
m encodings.iso8859_16
m encodings.iso8859_2
m encodings.iso8859_3
m encodings.iso8859_4
m encodings.iso8859_5
m encodings.iso8859_6
m encodings.iso8859_7
m encodings.iso8859_8
m encodings.iso8859_9
m encodings.johab
m encodings.koi8_r
m encodings.koi8_u
m encodings.latin_1
m encodings.mac_arabic
m encodings.mac_centeuro
m encodings.mac_croatian
m encodings.mac_cyrillic
m encodings.mac_farsi
m encodings.mac_greek
m encodings.mac_iceland
m encodings.mac_latin2
m encodings.mac_roman
m encodings.mac_romanian
m encodings.mac_turkish
m encodings.mbcs
m encodings.palmos
m encodings.ptcp154
m encodings.punycode
m encodings.quopri_codec
m encodings.raw_unicode_escape
m encodings.rot_13
m encodings.shift_jis
m encodings.shift_jis_2004
m encodings.shift_jisx0213
m encodings.string_escape
m encodings.tis_620
m encodings.undefined
m encodings.unicode_escape
m encodings.unicode_internal
m encodings.utf_16
m encodings.utf_16_be
m encodings.utf_16_le
m encodings.utf_32
m encodings.utf_32_be
m encodings.utf_32_le
m encodings.utf_7
m encodings.utf_8
m encodings.utf_8_sig
m encodings.uu_codec
m encodings.zlib_codec
m errno
m exceptions
m genericpath
m imp
m itertools
m linecache
m os
m posix
m posixpath
m pwd
m quopri
m re
m repr
m sre_compile
m sre_constants
m sre_parse
m stat
m string
m stringprep
m strop
m struct
m sys
m traceback
m types
m unicodedata
m warnings
m weakref
m zipimport
m zlib
/usr/lib/python2.7/re.py
/usr/lib/python2.7/sre_compile.py
/usr/lib/python2.7/sre_constants.py
/usr/lib/python2.7/sre_parse.py
/usr/lib/python2.7/string.py
copying /usr/lib/python2.7/lib-dynload/_codecs_cn.x86_64-linux-gnu.
so -> dist/_codecs_cn.x86_64-linux-gnu.so
copying /usr/lib/python2.7/lib-dynload/_codecs_hk.x86_64-linux-gnu.
so -> dist/_codecs_hk.x86_64-linux-gnu.so
copying /usr/lib/python2.7/lib-dynload/_codecs_iso2022.x86_64-linux
-gnu.so -> dist/_codecs_iso2022.x86_64-linux-gnu.so
copying /usr/lib/python2.7/lib-dynload/_codecs_jp.x86_64-linux-gnu.
so -> dist/_codecs_jp.x86_64-linux-gnu.so
copying /usr/lib/python2.7/lib-dynload/_codecs_kr.x86_64-linux-gnu.
so -> dist/_codecs_kr.x86_64-linux-gnu.so
copying /usr/lib/python2.7/lib-dynload/_codecs_tw.x86_64-linux-gnu.
so -> dist/_codecs_tw.x86_64-linux-gnu.so
copying /usr/lib/python2.7/lib-dynload/_ctypes.x86_64-linux-gnu.so
-> dist/_ctypes.x86_64-linux-gnu.so
copying /usr/lib/python2.7/lib-dynload/_multibytecodec.x86_64-linux
-gnu.so -> dist/_multibytecodec.x86_64-linux-gnu.so
copying /usr/lib/python2.7/lib-dynload/_tkinter.so -> dist/_tkinte
r.so
copying /usr/lib/python2.7/lib-dynload/bz2.x86_64-linux-gnu.so -> d
ist/bz2.x86_64-linux-gnu.so
creating directory dist/tcl/
copying /usr/share/tcltk/tcl8.6/tm.tcl -> dist/tcl/tm.tcl
copying /usr/share/tcltk/tcl8.6/safe.tcl -> dist/tcl/safe.tcl
copying /usr/share/tcltk/tcl8.6/parray.tcl -> dist/tcl/parray.tcl
copying /usr/share/tcltk/tcl8.6/history.tcl -> dist/tcl/history.tcl
copying /usr/share/tcltk/tcl8.6/tclIndex -> dist/tcl/tclIndex
copying /usr/share/tcltk/tcl8.6/tclAppInit.c -> dist/tcl/tclAppIni
t.c
copying /usr/share/tcltk/tcl8.6/word.tcl -> dist/tcl/word.tcl
copying /usr/share/tcltk/tcl8.6/auto.tcl -> dist/tcl/auto.tcl
copying /usr/share/tcltk/tcl8.6/init.tcl -> dist/tcl/init.tcl
copying /usr/share/tcltk/tcl8.6/package.tcl -> dist/tcl/package.tcl
copying /usr/share/tcltk/tcl8.6/clock.tcl -> dist/tcl/clock.tcl
creating directory dist/tcl/encoding
copying /usr/share/tcltk/tcl8.6/encoding/big5.enc -> dist/tcl/encod
ing/big5.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp1252.enc -> dist/tcl/enc
oding/cp1252.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso8859-14.enc -> dist/tc
l/encoding/iso8859-14.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp866.enc -> dist/tcl/enco
ding/cp866.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp1257.enc -> dist/tcl/enc
oding/cp1257.enc
copying /usr/share/tcltk/tcl8.6/encoding/tis-620.enc -> dist/tcl/en
coding/tis-620.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp949.enc -> dist/tcl/enco
ding/cp949.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp950.enc -> dist/tcl/enco
ding/cp950.enc
copying /usr/share/tcltk/tcl8.6/encoding/macUkraine.enc -> dist/tc
l/encoding/macUkraine.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso8859-15.enc -> dist/tc
l/encoding/iso8859-15.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp936.enc -> dist/tcl/enco
ding/cp936.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso2022-jp.enc -> dist/tc
l/encoding/iso2022-jp.enc
copying /usr/share/tcltk/tcl8.6/encoding/euc-kr.enc -> dist/tcl/enc
oding/euc-kr.enc
copying /usr/share/tcltk/tcl8.6/encoding/gb2312-raw.enc -> dist/tc
l/encoding/gb2312-raw.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso8859-5.enc -> dist/tcl/
encoding/iso8859-5.enc
copying /usr/share/tcltk/tcl8.6/encoding/jis0201.enc -> dist/tcl/en
coding/jis0201.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp1255.enc -> dist/tcl/enc
oding/cp1255.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp874.enc -> dist/tcl/enco
ding/cp874.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso8859-16.enc -> dist/tc
l/encoding/iso8859-16.enc
copying /usr/share/tcltk/tcl8.6/encoding/macRoman.enc -> dist/tcl/e
ncoding/macRoman.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp932.enc -> dist/tcl/enco
ding/cp932.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp860.enc -> dist/tcl/enco
ding/cp860.enc
copying /usr/share/tcltk/tcl8.6/encoding/jis0208.enc -> dist/tcl/en
coding/jis0208.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso8859-13.enc -> dist/tc
l/encoding/iso8859-13.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp862.enc -> dist/tcl/enco
ding/cp862.enc
copying /usr/share/tcltk/tcl8.6/encoding/macDingbats.enc -> dist/tc
l/encoding/macDingbats.enc
copying /usr/share/tcltk/tcl8.6/encoding/macTurkish.enc -> dist/tc
l/encoding/macTurkish.enc
copying /usr/share/tcltk/tcl8.6/encoding/symbol.enc -> dist/tcl/enc
oding/symbol.enc
copying /usr/share/tcltk/tcl8.6/encoding/macRomania.enc -> dist/tc
l/encoding/macRomania.enc
copying /usr/share/tcltk/tcl8.6/encoding/ebcdic.enc -> dist/tcl/enc
oding/ebcdic.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso8859-3.enc -> dist/tcl/
encoding/iso8859-3.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp857.enc -> dist/tcl/enco
ding/cp857.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso8859-9.enc -> dist/tcl/
encoding/iso8859-9.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp863.enc -> dist/tcl/enco
ding/cp863.enc
copying /usr/share/tcltk/tcl8.6/encoding/koi8-u.enc -> dist/tcl/enc
oding/koi8-u.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp865.enc -> dist/tcl/enco
ding/cp865.enc
copying /usr/share/tcltk/tcl8.6/encoding/ksc5601.enc -> dist/tcl/en
coding/ksc5601.enc
copying /usr/share/tcltk/tcl8.6/encoding/ascii.enc -> dist/tcl/enco
ding/ascii.enc
copying /usr/share/tcltk/tcl8.6/encoding/euc-jp.enc -> dist/tcl/enc
oding/euc-jp.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp1250.enc -> dist/tcl/enc
oding/cp1250.enc
copying /usr/share/tcltk/tcl8.6/encoding/gb2312.enc -> dist/tcl/enc
oding/gb2312.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp737.enc -> dist/tcl/enco
ding/cp737.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp852.enc -> dist/tcl/enco
ding/cp852.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp855.enc -> dist/tcl/enco
ding/cp855.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso8859-2.enc -> dist/tcl/
encoding/iso8859-2.enc
copying /usr/share/tcltk/tcl8.6/encoding/gb12345.enc -> dist/tcl/en
coding/gb12345.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp1254.enc -> dist/tcl/enc
oding/cp1254.enc
copying /usr/share/tcltk/tcl8.6/encoding/shiftjis.enc -> dist/tcl/e
ncoding/shiftjis.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp864.enc -> dist/tcl/enco
ding/cp864.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso2022-kr.enc -> dist/tc
l/encoding/iso2022-kr.enc
copying /usr/share/tcltk/tcl8.6/encoding/dingbats.enc -> dist/tcl/e
ncoding/dingbats.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp1256.enc -> dist/tcl/enc
oding/cp1256.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso8859-10.enc -> dist/tc
l/encoding/iso8859-10.enc
copying /usr/share/tcltk/tcl8.6/encoding/macCentEuro.enc -> dist/tc
l/encoding/macCentEuro.enc
copying /usr/share/tcltk/tcl8.6/encoding/macGreek.enc -> dist/tcl/e
ncoding/macGreek.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso8859-4.enc -> dist/tcl/
encoding/iso8859-4.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp775.enc -> dist/tcl/enco
ding/cp775.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp1251.enc -> dist/tcl/enc
oding/cp1251.enc
copying /usr/share/tcltk/tcl8.6/encoding/koi8-r.enc -> dist/tcl/enc
oding/koi8-r.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso8859-8.enc -> dist/tcl/
encoding/iso8859-8.enc
copying /usr/share/tcltk/tcl8.6/encoding/macThai.enc -> dist/tcl/en
coding/macThai.enc
copying /usr/share/tcltk/tcl8.6/encoding/jis0212.enc -> dist/tcl/en
coding/jis0212.enc
copying /usr/share/tcltk/tcl8.6/encoding/gb1988.enc -> dist/tcl/enc
oding/gb1988.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp1258.enc -> dist/tcl/enc
oding/cp1258.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso2022.enc -> dist/tcl/en
coding/iso2022.enc
copying /usr/share/tcltk/tcl8.6/encoding/euc-cn.enc -> dist/tcl/enc
oding/euc-cn.enc
copying /usr/share/tcltk/tcl8.6/encoding/macIceland.enc -> dist/tc
l/encoding/macIceland.enc
copying /usr/share/tcltk/tcl8.6/encoding/macCroatian.enc -> dist/tc
l/encoding/macCroatian.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp869.enc -> dist/tcl/enco
ding/cp869.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso8859-6.enc -> dist/tcl/
encoding/iso8859-6.enc
copying /usr/share/tcltk/tcl8.6/encoding/macJapan.enc -> dist/tcl/e
ncoding/macJapan.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp861.enc -> dist/tcl/enco
ding/cp861.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp437.enc -> dist/tcl/enco
ding/cp437.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp850.enc -> dist/tcl/enco
ding/cp850.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso8859-1.enc -> dist/tcl/
encoding/iso8859-1.enc
copying /usr/share/tcltk/tcl8.6/encoding/cp1253.enc -> dist/tcl/enc
oding/cp1253.enc
copying /usr/share/tcltk/tcl8.6/encoding/iso8859-7.enc -> dist/tcl/
encoding/iso8859-7.enc
copying /usr/share/tcltk/tcl8.6/encoding/macCyrillic.enc -> dist/tc
l/encoding/macCyrillic.enc
creating directory dist/tcl/msgs
copying /usr/share/tcltk/tcl8.6/msgs/en_in.msg -> dist/tcl/msgs/en_
in.msg
copying /usr/share/tcltk/tcl8.6/msgs/sw.msg -> dist/tcl/msgs/sw.msg
copying /usr/share/tcltk/tcl8.6/msgs/mt.msg -> dist/tcl/msgs/mt.msg
copying /usr/share/tcltk/tcl8.6/msgs/en_be.msg -> dist/tcl/msgs/en_
be.msg
copying /usr/share/tcltk/tcl8.6/msgs/fo.msg -> dist/tcl/msgs/fo.msg
copying /usr/share/tcltk/tcl8.6/msgs/kw_gb.msg -> dist/tcl/msgs/kw_
gb.msg
copying /usr/share/tcltk/tcl8.6/msgs/mr_in.msg -> dist/tcl/msgs/mr_
in.msg
copying /usr/share/tcltk/tcl8.6/msgs/ar_jo.msg -> dist/tcl/msgs/ar_
jo.msg
copying /usr/share/tcltk/tcl8.6/msgs/de_at.msg -> dist/tcl/msgs/de_
at.msg
copying /usr/share/tcltk/tcl8.6/msgs/is.msg -> dist/tcl/msgs/is.msg
copying /usr/share/tcltk/tcl8.6/msgs/ru_ua.msg -> dist/tcl/msgs/ru_
ua.msg
copying /usr/share/tcltk/tcl8.6/msgs/pt_br.msg -> dist/tcl/msgs/pt_
br.msg
copying /usr/share/tcltk/tcl8.6/msgs/bg.msg -> dist/tcl/msgs/bg.msg
copying /usr/share/tcltk/tcl8.6/msgs/af_za.msg -> dist/tcl/msgs/af_
za.msg
copying /usr/share/tcltk/tcl8.6/msgs/fi.msg -> dist/tcl/msgs/fi.msg
copying /usr/share/tcltk/tcl8.6/msgs/ja.msg -> dist/tcl/msgs/ja.msg
copying /usr/share/tcltk/tcl8.6/msgs/en_za.msg -> dist/tcl/msgs/en_
za.msg
copying /usr/share/tcltk/tcl8.6/msgs/en_ie.msg -> dist/tcl/msgs/en_
ie.msg
copying /usr/share/tcltk/tcl8.6/msgs/kw.msg -> dist/tcl/msgs/kw.msg
copying /usr/share/tcltk/tcl8.6/msgs/te.msg -> dist/tcl/msgs/te.msg
copying /usr/share/tcltk/tcl8.6/msgs/zh_cn.msg -> dist/tcl/msgs/zh_
cn.msg
copying /usr/share/tcltk/tcl8.6/msgs/ru.msg -> dist/tcl/msgs/ru.msg
copying /usr/share/tcltk/tcl8.6/msgs/zh_sg.msg -> dist/tcl/msgs/zh_
sg.msg
copying /usr/share/tcltk/tcl8.6/msgs/zh_hk.msg -> dist/tcl/msgs/zh_
hk.msg
copying /usr/share/tcltk/tcl8.6/msgs/hi_in.msg -> dist/tcl/msgs/hi_
in.msg
copying /usr/share/tcltk/tcl8.6/msgs/fa_ir.msg -> dist/tcl/msgs/fa_
ir.msg
copying /usr/share/tcltk/tcl8.6/msgs/gv.msg -> dist/tcl/msgs/gv.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_gt.msg -> dist/tcl/msgs/es_
gt.msg
copying /usr/share/tcltk/tcl8.6/msgs/fr_ca.msg -> dist/tcl/msgs/fr_
ca.msg
copying /usr/share/tcltk/tcl8.6/msgs/ar_in.msg -> dist/tcl/msgs/ar_
in.msg
copying /usr/share/tcltk/tcl8.6/msgs/ga.msg -> dist/tcl/msgs/ga.msg
copying /usr/share/tcltk/tcl8.6/msgs/ta_in.msg -> dist/tcl/msgs/ta_
in.msg
copying /usr/share/tcltk/tcl8.6/msgs/pt.msg -> dist/tcl/msgs/pt.msg
copying /usr/share/tcltk/tcl8.6/msgs/ms.msg -> dist/tcl/msgs/ms.msg
copying /usr/share/tcltk/tcl8.6/msgs/sr.msg -> dist/tcl/msgs/sr.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_py.msg -> dist/tcl/msgs/es_
py.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_pr.msg -> dist/tcl/msgs/es_
pr.msg
copying /usr/share/tcltk/tcl8.6/msgs/en_sg.msg -> dist/tcl/msgs/en_
sg.msg
copying /usr/share/tcltk/tcl8.6/msgs/kl.msg -> dist/tcl/msgs/kl.msg
copying /usr/share/tcltk/tcl8.6/msgs/en_zw.msg -> dist/tcl/msgs/en_
zw.msg
copying /usr/share/tcltk/tcl8.6/msgs/lt.msg -> dist/tcl/msgs/lt.msg
copying /usr/share/tcltk/tcl8.6/msgs/hu.msg -> dist/tcl/msgs/hu.msg
copying /usr/share/tcltk/tcl8.6/msgs/te_in.msg -> dist/tcl/msgs/te_
in.msg
copying /usr/share/tcltk/tcl8.6/msgs/zh_tw.msg -> dist/tcl/msgs/zh_
tw.msg
copying /usr/share/tcltk/tcl8.6/msgs/fr_ch.msg -> dist/tcl/msgs/fr_
ch.msg
copying /usr/share/tcltk/tcl8.6/msgs/kok.msg -> dist/tcl/msgs/kok.m
sg
copying /usr/share/tcltk/tcl8.6/msgs/zh.msg -> dist/tcl/msgs/zh.msg
copying /usr/share/tcltk/tcl8.6/msgs/nb.msg -> dist/tcl/msgs/nb.msg
copying /usr/share/tcltk/tcl8.6/msgs/id.msg -> dist/tcl/msgs/id.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_ar.msg -> dist/tcl/msgs/es_
ar.msg
copying /usr/share/tcltk/tcl8.6/msgs/ar.msg -> dist/tcl/msgs/ar.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_bo.msg -> dist/tcl/msgs/es_
bo.msg
copying /usr/share/tcltk/tcl8.6/msgs/hr.msg -> dist/tcl/msgs/hr.msg
copying /usr/share/tcltk/tcl8.6/msgs/en_nz.msg -> dist/tcl/msgs/en_
nz.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_pa.msg -> dist/tcl/msgs/es_
pa.msg
copying /usr/share/tcltk/tcl8.6/msgs/fa.msg -> dist/tcl/msgs/fa.msg
copying /usr/share/tcltk/tcl8.6/msgs/en_bw.msg -> dist/tcl/msgs/en_
bw.msg
copying /usr/share/tcltk/tcl8.6/msgs/sl.msg -> dist/tcl/msgs/sl.msg
copying /usr/share/tcltk/tcl8.6/msgs/de.msg -> dist/tcl/msgs/de.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_uy.msg -> dist/tcl/msgs/es_
uy.msg
copying /usr/share/tcltk/tcl8.6/msgs/en_hk.msg -> dist/tcl/msgs/en_
hk.msg
copying /usr/share/tcltk/tcl8.6/msgs/en_gb.msg -> dist/tcl/msgs/en_
gb.msg
copying /usr/share/tcltk/tcl8.6/msgs/en_ca.msg -> dist/tcl/msgs/en_
ca.msg
copying /usr/share/tcltk/tcl8.6/msgs/af.msg -> dist/tcl/msgs/af.msg
copying /usr/share/tcltk/tcl8.6/msgs/ca.msg -> dist/tcl/msgs/ca.msg
copying /usr/share/tcltk/tcl8.6/msgs/ro.msg -> dist/tcl/msgs/ro.msg
copying /usr/share/tcltk/tcl8.6/msgs/el.msg -> dist/tcl/msgs/el.msg
copying /usr/share/tcltk/tcl8.6/msgs/es.msg -> dist/tcl/msgs/es.msg
copying /usr/share/tcltk/tcl8.6/msgs/bn.msg -> dist/tcl/msgs/bn.msg
copying /usr/share/tcltk/tcl8.6/msgs/pl.msg -> dist/tcl/msgs/pl.msg
copying /usr/share/tcltk/tcl8.6/msgs/gl_es.msg -> dist/tcl/msgs/gl_
es.msg
copying /usr/share/tcltk/tcl8.6/msgs/it.msg -> dist/tcl/msgs/it.msg
copying /usr/share/tcltk/tcl8.6/msgs/en_au.msg -> dist/tcl/msgs/en_
au.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_sv.msg -> dist/tcl/msgs/es_
sv.msg
copying /usr/share/tcltk/tcl8.6/msgs/nl.msg -> dist/tcl/msgs/nl.msg
copying /usr/share/tcltk/tcl8.6/msgs/de_be.msg -> dist/tcl/msgs/de_
be.msg
copying /usr/share/tcltk/tcl8.6/msgs/sk.msg -> dist/tcl/msgs/sk.msg
copying /usr/share/tcltk/tcl8.6/msgs/he.msg -> dist/tcl/msgs/he.msg
copying /usr/share/tcltk/tcl8.6/msgs/fa_in.msg -> dist/tcl/msgs/fa_
in.msg
copying /usr/share/tcltk/tcl8.6/msgs/ko_kr.msg -> dist/tcl/msgs/ko_
kr.msg
copying /usr/share/tcltk/tcl8.6/msgs/cs.msg -> dist/tcl/msgs/cs.msg
copying /usr/share/tcltk/tcl8.6/msgs/mr.msg -> dist/tcl/msgs/mr.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_hn.msg -> dist/tcl/msgs/es_
hn.msg
copying /usr/share/tcltk/tcl8.6/msgs/ar_sy.msg -> dist/tcl/msgs/ar_
sy.msg
copying /usr/share/tcltk/tcl8.6/msgs/en_ph.msg -> dist/tcl/msgs/en_
ph.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_co.msg -> dist/tcl/msgs/es_
co.msg
copying /usr/share/tcltk/tcl8.6/msgs/fo_fo.msg -> dist/tcl/msgs/fo_
fo.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_do.msg -> dist/tcl/msgs/es_
do.msg
copying /usr/share/tcltk/tcl8.6/msgs/eo.msg -> dist/tcl/msgs/eo.msg
copying /usr/share/tcltk/tcl8.6/msgs/eu.msg -> dist/tcl/msgs/eu.msg
copying /usr/share/tcltk/tcl8.6/msgs/ko.msg -> dist/tcl/msgs/ko.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_mx.msg -> dist/tcl/msgs/es_
mx.msg
copying /usr/share/tcltk/tcl8.6/msgs/et.msg -> dist/tcl/msgs/et.msg
copying /usr/share/tcltk/tcl8.6/msgs/lv.msg -> dist/tcl/msgs/lv.msg
copying /usr/share/tcltk/tcl8.6/msgs/nl_be.msg -> dist/tcl/msgs/nl_
be.msg
copying /usr/share/tcltk/tcl8.6/msgs/ga_ie.msg -> dist/tcl/msgs/ga_
ie.msg
copying /usr/share/tcltk/tcl8.6/msgs/fr_be.msg -> dist/tcl/msgs/fr_
be.msg
copying /usr/share/tcltk/tcl8.6/msgs/kok_in.msg -> dist/tcl/msgs/ko
k_in.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_ni.msg -> dist/tcl/msgs/es_
ni.msg
copying /usr/share/tcltk/tcl8.6/msgs/da.msg -> dist/tcl/msgs/da.msg
copying /usr/share/tcltk/tcl8.6/msgs/gv_gb.msg -> dist/tcl/msgs/gv_
gb.msg
copying /usr/share/tcltk/tcl8.6/msgs/kl_gl.msg -> dist/tcl/msgs/kl_
gl.msg
copying /usr/share/tcltk/tcl8.6/msgs/sh.msg -> dist/tcl/msgs/sh.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_cl.msg -> dist/tcl/msgs/es_
cl.msg
copying /usr/share/tcltk/tcl8.6/msgs/hi.msg -> dist/tcl/msgs/hi.msg
copying /usr/share/tcltk/tcl8.6/msgs/nn.msg -> dist/tcl/msgs/nn.msg
copying /usr/share/tcltk/tcl8.6/msgs/vi.msg -> dist/tcl/msgs/vi.msg
copying /usr/share/tcltk/tcl8.6/msgs/tr.msg -> dist/tcl/msgs/tr.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_ec.msg -> dist/tcl/msgs/es_
ec.msg
copying /usr/share/tcltk/tcl8.6/msgs/ms_my.msg -> dist/tcl/msgs/ms_
my.msg
copying /usr/share/tcltk/tcl8.6/msgs/id_id.msg -> dist/tcl/msgs/id_
id.msg
copying /usr/share/tcltk/tcl8.6/msgs/bn_in.msg -> dist/tcl/msgs/bn_
in.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_ve.msg -> dist/tcl/msgs/es_
ve.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_pe.msg -> dist/tcl/msgs/es_
pe.msg
copying /usr/share/tcltk/tcl8.6/msgs/ta.msg -> dist/tcl/msgs/ta.msg
copying /usr/share/tcltk/tcl8.6/msgs/eu_es.msg -> dist/tcl/msgs/eu_
es.msg
copying /usr/share/tcltk/tcl8.6/msgs/be.msg -> dist/tcl/msgs/be.msg
copying /usr/share/tcltk/tcl8.6/msgs/th.msg -> dist/tcl/msgs/th.msg
copying /usr/share/tcltk/tcl8.6/msgs/uk.msg -> dist/tcl/msgs/uk.msg
copying /usr/share/tcltk/tcl8.6/msgs/it_ch.msg -> dist/tcl/msgs/it_
ch.msg
copying /usr/share/tcltk/tcl8.6/msgs/es_cr.msg -> dist/tcl/msgs/es_
cr.msg
copying /usr/share/tcltk/tcl8.6/msgs/gl.msg -> dist/tcl/msgs/gl.msg
copying /usr/share/tcltk/tcl8.6/msgs/ar_lb.msg -> dist/tcl/msgs/ar_
lb.msg
copying /usr/share/tcltk/tcl8.6/msgs/sq.msg -> dist/tcl/msgs/sq.msg
copying /usr/share/tcltk/tcl8.6/msgs/sv.msg -> dist/tcl/msgs/sv.msg
copying /usr/share/tcltk/tcl8.6/msgs/mk.msg -> dist/tcl/msgs/mk.msg
copying /usr/share/tcltk/tcl8.6/msgs/fr.msg -> dist/tcl/msgs/fr.msg
creating directory dist/tcl/opt0.4
copying /usr/share/tcltk/tcl8.6/opt0.4/optparse.tcl -> dist/tcl/opt
0.4/optparse.tcl
copying /usr/share/tcltk/tcl8.6/opt0.4/pkgIndex.tcl -> dist/tcl/opt
0.4/pkgIndex.tcl
creating directory dist/tcl/http1.0
copying /usr/share/tcltk/tcl8.6/http1.0/pkgIndex.tcl -> dist/tcl/ht
tp1.0/pkgIndex.tcl
copying /usr/share/tcltk/tcl8.6/http1.0/http.tcl -> dist/tcl/http1.
0/http.tcl
creating directory dist/tcl/tcl8
copying /usr/share/tcltk/tcl8.6/tcl8/platform-1.0.13.tm -> dist/tc
l/tcl8/platform-1.0.13.tm
copying /usr/share/tcltk/tcl8.6/tcl8/tcltest-2.3.8.tm -> dist/tcl/t
cl8/tcltest-2.3.8.tm
copying /usr/share/tcltk/tcl8.6/tcl8/http-2.8.8.tm -> dist/tcl/tcl
8/http-2.8.8.tm
copying /usr/share/tcltk/tcl8.6/tcl8/msgcat-1.5.2.tm -> dist/tcl/tc
l8/msgcat-1.5.2.tm
creating directory dist/tcl/tcl8/platform
copying /usr/share/tcltk/tcl8.6/tcl8/platform/shell-1.1.4.tm -> dis
t/tcl/tcl8/platform/shell-1.1.4.tm
creating directory dist/tk/
copying /usr/share/tcltk/tk8.6/msgbox.tcl -> dist/tk/msgbox.tcl
copying /usr/share/tcltk/tk8.6/obsolete.tcl -> dist/tk/obsolete.tcl
copying /usr/share/tcltk/tk8.6/safetk.tcl -> dist/tk/safetk.tcl
copying /usr/share/tcltk/tk8.6/megawidget.tcl -> dist/tk/megawidge
t.tcl
copying /usr/share/tcltk/tk8.6/spinbox.tcl -> dist/tk/spinbox.tcl
copying /usr/share/tcltk/tk8.6/icons.tcl -> dist/tk/icons.tcl
copying /usr/share/tcltk/tk8.6/panedwindow.tcl -> dist/tk/panedwind
ow.tcl
copying /usr/share/tcltk/tk8.6/palette.tcl -> dist/tk/palette.tcl
copying /usr/share/tcltk/tk8.6/mkpsenc.tcl -> dist/tk/mkpsenc.tcl
copying /usr/share/tcltk/tk8.6/clrpick.tcl -> dist/tk/clrpick.tcl
copying /usr/share/tcltk/tk8.6/bgerror.tcl -> dist/tk/bgerror.tcl
copying /usr/share/tcltk/tk8.6/button.tcl -> dist/tk/button.tcl
copying /usr/share/tcltk/tk8.6/tkfbox.tcl -> dist/tk/tkfbox.tcl
copying /usr/share/tcltk/tk8.6/xmfbox.tcl -> dist/tk/xmfbox.tcl
copying /usr/share/tcltk/tk8.6/menu.tcl -> dist/tk/menu.tcl
copying /usr/share/tcltk/tk8.6/choosedir.tcl -> dist/tk/choosedir.t
cl
copying /usr/share/tcltk/tk8.6/scrlbar.tcl -> dist/tk/scrlbar.tcl
copying /usr/share/tcltk/tk8.6/listbox.tcl -> dist/tk/listbox.tcl
copying /usr/share/tcltk/tk8.6/tclIndex -> dist/tk/tclIndex
copying /usr/share/tcltk/tk8.6/tkAppInit.c -> dist/tk/tkAppInit.c
copying /usr/share/tcltk/tk8.6/comdlg.tcl -> dist/tk/comdlg.tcl
copying /usr/share/tcltk/tk8.6/fontchooser.tcl -> dist/tk/fontchoos
er.tcl
copying /usr/share/tcltk/tk8.6/iconlist.tcl -> dist/tk/iconlist.tcl
copying /usr/share/tcltk/tk8.6/optMenu.tcl -> dist/tk/optMenu.tcl
copying /usr/share/tcltk/tk8.6/text.tcl -> dist/tk/text.tcl
copying /usr/share/tcltk/tk8.6/console.tcl -> dist/tk/console.tcl
copying /usr/share/tcltk/tk8.6/dialog.tcl -> dist/tk/dialog.tcl
copying /usr/share/tcltk/tk8.6/scale.tcl -> dist/tk/scale.tcl
copying /usr/share/tcltk/tk8.6/focus.tcl -> dist/tk/focus.tcl
copying /usr/share/tcltk/tk8.6/tearoff.tcl -> dist/tk/tearoff.tcl
copying /usr/share/tcltk/tk8.6/tk.tcl -> dist/tk/tk.tcl
copying /usr/share/tcltk/tk8.6/entry.tcl -> dist/tk/entry.tcl
copying /usr/share/tcltk/tk8.6/unsupported.tcl -> dist/tk/unsupport
ed.tcl
creating directory dist/tk/images
copying /usr/share/tcltk/tk8.6/images/README -> dist/tk/images/READ
ME
copying /usr/share/tcltk/tk8.6/images/lamp.png -> dist/tk/images/la
mp.png
copying /usr/share/tcltk/tk8.6/images/pwrdLogo.eps -> dist/tk/image
s/pwrdLogo.eps
copying /usr/share/tcltk/tk8.6/images/logoMed.gif -> dist/tk/image
s/logoMed.gif
copying /usr/share/tcltk/tk8.6/images/logo.eps -> dist/tk/images/lo
go.eps
copying /usr/share/tcltk/tk8.6/images/logo100.gif -> dist/tk/image
s/logo100.gif
copying /usr/share/tcltk/tk8.6/images/logo64.gif -> dist/tk/images/
logo64.gif
copying /usr/share/tcltk/tk8.6/images/pwrdLogo150.gif -> dist/tk/im
ages/pwrdLogo150.gif
copying /usr/share/tcltk/tk8.6/images/pwrdLogo75.gif -> dist/tk/ima
ges/pwrdLogo75.gif
copying /usr/share/tcltk/tk8.6/images/tai-ku.gif -> dist/tk/images/
tai-ku.gif
copying /usr/share/tcltk/tk8.6/images/pwrdLogo175.gif -> dist/tk/im
ages/pwrdLogo175.gif
copying /usr/share/tcltk/tk8.6/images/pwrdLogo100.gif -> dist/tk/im
ages/pwrdLogo100.gif
copying /usr/share/tcltk/tk8.6/images/logoLarge.gif -> dist/tk/imag
es/logoLarge.gif
copying /usr/share/tcltk/tk8.6/images/pwrdLogo200.gif -> dist/tk/im
ages/pwrdLogo200.gif
creating directory dist/tk/msgs
copying /usr/share/tcltk/tk8.6/msgs/ru.msg -> dist/tk/msgs/ru.msg
copying /usr/share/tcltk/tk8.6/msgs/en.msg -> dist/tk/msgs/en.msg
copying /usr/share/tcltk/tk8.6/msgs/pt.msg -> dist/tk/msgs/pt.msg
copying /usr/share/tcltk/tk8.6/msgs/hu.msg -> dist/tk/msgs/hu.msg
copying /usr/share/tcltk/tk8.6/msgs/de.msg -> dist/tk/msgs/de.msg
copying /usr/share/tcltk/tk8.6/msgs/en_gb.msg -> dist/tk/msgs/en_g
b.msg
copying /usr/share/tcltk/tk8.6/msgs/el.msg -> dist/tk/msgs/el.msg
copying /usr/share/tcltk/tk8.6/msgs/es.msg -> dist/tk/msgs/es.msg
copying /usr/share/tcltk/tk8.6/msgs/pl.msg -> dist/tk/msgs/pl.msg
copying /usr/share/tcltk/tk8.6/msgs/it.msg -> dist/tk/msgs/it.msg
copying /usr/share/tcltk/tk8.6/msgs/nl.msg -> dist/tk/msgs/nl.msg
copying /usr/share/tcltk/tk8.6/msgs/cs.msg -> dist/tk/msgs/cs.msg
copying /usr/share/tcltk/tk8.6/msgs/eo.msg -> dist/tk/msgs/eo.msg
copying /usr/share/tcltk/tk8.6/msgs/da.msg -> dist/tk/msgs/da.msg
copying /usr/share/tcltk/tk8.6/msgs/sv.msg -> dist/tk/msgs/sv.msg
copying /usr/share/tcltk/tk8.6/msgs/fr.msg -> dist/tk/msgs/fr.msg
creating directory dist/tk/ttk
copying /usr/share/tcltk/tk8.6/ttk/winTheme.tcl -> dist/tk/ttk/winT
heme.tcl
copying /usr/share/tcltk/tk8.6/ttk/treeview.tcl -> dist/tk/ttk/tree
view.tcl
copying /usr/share/tcltk/tk8.6/ttk/spinbox.tcl -> dist/tk/ttk/spinb
ox.tcl
copying /usr/share/tcltk/tk8.6/ttk/panedwindow.tcl -> dist/tk/ttk/p
anedwindow.tcl
copying /usr/share/tcltk/tk8.6/ttk/xpTheme.tcl -> dist/tk/ttk/xpThe
me.tcl
copying /usr/share/tcltk/tk8.6/ttk/sizegrip.tcl -> dist/tk/ttk/size
grip.tcl
copying /usr/share/tcltk/tk8.6/ttk/clamTheme.tcl -> dist/tk/ttk/cla
mTheme.tcl
copying /usr/share/tcltk/tk8.6/ttk/button.tcl -> dist/tk/ttk/butto
n.tcl
copying /usr/share/tcltk/tk8.6/ttk/menubutton.tcl -> dist/tk/ttk/me
nubutton.tcl
copying /usr/share/tcltk/tk8.6/ttk/cursors.tcl -> dist/tk/ttk/curso
rs.tcl
copying /usr/share/tcltk/tk8.6/ttk/progress.tcl -> dist/tk/ttk/prog
ress.tcl
copying /usr/share/tcltk/tk8.6/ttk/classicTheme.tcl -> dist/tk/ttk/
classicTheme.tcl
copying /usr/share/tcltk/tk8.6/ttk/notebook.tcl -> dist/tk/ttk/note
book.tcl
copying /usr/share/tcltk/tk8.6/ttk/aquaTheme.tcl -> dist/tk/ttk/aqu
aTheme.tcl
copying /usr/share/tcltk/tk8.6/ttk/vistaTheme.tcl -> dist/tk/ttk/vi
staTheme.tcl
copying /usr/share/tcltk/tk8.6/ttk/combobox.tcl -> dist/tk/ttk/comb
obox.tcl
copying /usr/share/tcltk/tk8.6/ttk/ttk.tcl -> dist/tk/ttk/ttk.tcl
copying /usr/share/tcltk/tk8.6/ttk/scale.tcl -> dist/tk/ttk/scale.t
cl
copying /usr/share/tcltk/tk8.6/ttk/utils.tcl -> dist/tk/ttk/utils.t
cl
copying /usr/share/tcltk/tk8.6/ttk/fonts.tcl -> dist/tk/ttk/fonts.t
cl
copying /usr/share/tcltk/tk8.6/ttk/scrollbar.tcl -> dist/tk/ttk/scr
ollbar.tcl
copying /usr/share/tcltk/tk8.6/ttk/entry.tcl -> dist/tk/ttk/entry.t
cl
copying /usr/share/tcltk/tk8.6/ttk/defaults.tcl -> dist/tk/ttk/defa
ults.tcl
copying /usr/share/tcltk/tk8.6/ttk/altTheme.tcl -> dist/tk/ttk/altT
heme.tcl
In [90]:
!ls progs/ball/
ball.py dist
In [91]:
!ls -lh progs/ball/dist
razem 5,4M
-rwxr-xr-x 1 szwabin szwabin 771K wrz 14 15:12 ball
-rw-r--r-- 1 szwabin szwabin 42K paź 14 2015 bz2.x86_64-linux-gn
u.so
-rw-r--r-- 1 szwabin szwabin 147K paź 14 2015 _codecs_cn.x86_64-li
nux-gnu.so
-rw-r--r-- 1 szwabin szwabin 155K paź 14 2015 _codecs_hk.x86_64-li
nux-gnu.so
-rw-r--r-- 1 szwabin szwabin 27K paź 14 2015 _codecs_iso2022.x86_
64-linux-gnu.so
-rw-r--r-- 1 szwabin szwabin 259K paź 14 2015 _codecs_jp.x86_64-li
nux-gnu.so
-rw-r--r-- 1 szwabin szwabin 131K paź 14 2015 _codecs_kr.x86_64-li
nux-gnu.so
-rw-r--r-- 1 szwabin szwabin 107K paź 14 2015 _codecs_tw.x86_64-li
nux-gnu.so
-rw-r--r-- 1 szwabin szwabin 133K paź 14 2015 _ctypes.x86_64-linux
-gnu.so
-rw-r--r-- 1 szwabin szwabin 3,5M paź 14 2015 libpython2.7.so.1.0
-rw-r--r-- 1 szwabin szwabin 43K paź 14 2015 _multibytecodec.x86_
64-linux-gnu.so
drwxrwxr-x 7 szwabin szwabin 4,0K wrz 14 15:12 tcl
drwxrwxr-x 5 szwabin szwabin 4,0K wrz 14 15:12 tk
-rw-r--r-- 1 szwabin szwabin 59K gru 15 2014 _tkinter.so
In [92]:
!file progs/ball/dist/ball
progs/ball/dist/ball: ELF 64-bit LSB executable, x86-64, version 1
(SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.
2, for GNU/Linux 2.6.24, BuildID[sha1]=91b249608d54d6e1c116ad93ea86
5efec06da7a3, stripped
In [93]:
!./progs/ball/dist/ball