Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Preparing _tkinter and sqlite3 for Python installation (no admin rights)

Tags:

python

tkinter

I am trying to build Python directly from source code, with no admin rights, and after running:

export CPPFLAGS='-I/opt/sqlite-3.7.16.2/include -I/opt/tk8.6.0/include
-I/opt/tcl8.6.0/include/'

export LDFLAGS='-L/opt/sqlite-3.7.16.2/lib -L/opt/tk8.6.0/lib/
-L/opt/tcl8.6.0/lib/ ./configure --prefix=/path_to_python-2.7.4 --enable-shared'

and then

make

I get the following:

building '_tkinter' extension

gcc -pthread -fPIC -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DWITH_APPINIT=1 -I/usr/X11/include -I. -IInclude -I./Include -I/opt/sqlite/sqlite-3.7.16.2/include -I/opt/tk8.6.0/include -I/opt/tcl8.6.0/include -I/usr/local/include -I/opt/python/src/Python-2.7.4/Include -I/opt/python/src/Python-2.7.4 -c /opt/python/src/Python-2.7.4/Modules/_tkinter.c -o build/temp.linux-x86_64-2.7/opt/python/src/Python-2.7.4/Modules/_tkinter.o

gcc -pthread -fPIC -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DWITH_APPINIT=1 -I/usr/X11/include -I. -IInclude -I./Include -I/opt/sqlite/sqlite-3.7.16.2/include -I/opt/tk8.6.0/include -I/opt/tcl8.6.0/include -I/usr/local/include -I/opt/python/src/Python-2.7.4/Include -I/opt/python/src/Python-2.7.4 -c /opt/python/src/Python-2.7.4/Modules/tkappinit.c -o build/temp.linux-x86_64-2.7/opt/python/src/Python-2.7.4/Modules/tkappinit.o

gcc -pthread -shared -L/opt/sqlite/sqlite-3.7.16.2/lib -L/opt/tk8.6.0/lib/ -L/opt/tcl8.6.0/lib/ -L/opt/sqlite/sqlite-3.7.16.2/lib -L/opt/tk8.6.0/lib/ -L/opt/tcl8.6.0/lib/ -I. -IInclude -I./Include -I/opt/sqlite/sqlite-3.7.16.2/include -I/opt/tk8.6.0/include -I/opt/tcl8.6.0/include build/temp.linux-x86_64-2.7/opt/python/src/Python-2.7.4/Modules/_tkinter.o build/temp.linux-x86_64-2.7/opt/python/src/Python-2.7.4/Modules/tkappinit.o -L/usr/X11/lib -L/opt/sqlite/sqlite-3.7.16.2/lib -L/opt/tk8.6.0/lib/ -L/opt/tcl8.6.0/lib/ -L/usr/local/lib -L. -ltk8.6 -ltcl8.6 -lX11 -lpython2.7 -o build/lib.linux-x86_64-2.7/_tkinter.so

* WARNING: renaming "_tkinter" since importing it failed: libtk8.6.so: cannot open shared object file: No such file or directory

The odd thing is that I can see libtk8.6.so. It is actually right there under /opt/tcl8.6.0/lib as I specified with LDFLAGS.

Why did that compilation fail?

like image 551
Amelio Vazquez-Reina Avatar asked Apr 15 '13 23:04

Amelio Vazquez-Reina


Video Answer


1 Answers

This problem takes place during installation in setup.py, when Python tries to import _tkinter. If you look at the function build_extension, there is a block that says:

imp.load_dynamic(ext.name, ext_filename)

This line tries a dynamic load of _tkinter (which uses the dynamic shared library libtk8.6.so) . So even though the compilation/linking worked, when Python tests the module, it uses the dynamic library, and I didn't have tcl/lib nor tk/lib in LD_LIBRARY_PATH. Once I added these, it all worked fine.

In summary: I had to add the following include paths through CPPFLAGS

  • /path_to/sqlite3/include
  • /path_to/tcl/include
  • /path_to/tk/include

the following lib paths through LDFLAGS

  • /path_to/sqlite3/lib
  • /path_to/tcl/lib
  • /path_to/tk/lib

and the following lib paths through LD_LIBRARY_PATH:

  • /path_to/sqlite3/lib
  • /path_to/tcl/lib
  • /path_to/tk/lib

with all this, everything worked.

like image 198
Amelio Vazquez-Reina Avatar answered Nov 14 '22 22:11

Amelio Vazquez-Reina