为Python安装准备_tkinter和sqlite3(无管理员权限)

时间:2013-04-15 23:32:39

标签: python tkinter

我正在尝试直接从源代码构建Python,没有管理员权限,并且在运行之后:

  

export CPPFLAGS =' - I / opt / sqlite-3.7.16.2 / include -I / opt / tk8.6.0 / include
    -I /选择/ tcl8.6.0 /包含/

     

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'

然后

make

我得到以下内容:

  

建立'_tkinter'扩展

     

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 / _tk​​inter.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   建立/ temp.linux-x86_64-2.7的/ opt /蟒蛇/ src目录/ Python的2.7.4 /模块/ 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 / _tk​​inter.so

     

* 警告:重命名“_tkinter”,因为导入失败:libtk8.6.so:无法打开共享对象文件:没有这样的文件或目录

奇怪的是我可以看到libtk8.6.so。它实际上就在我/opt/tcl8.6.0/lib指定的LDFLAGS下。

为什么编译失败?

1 个答案:

答案 0 :(得分:5)

当Python尝试导入setup.py时,在_tkinter中安装期间会发生此问题。如果您查看函数build_extension,则会出现一个块:

imp.load_dynamic(ext.name, ext_filename)

此行尝试动态加载_tkinter(使用动态共享库libtk8.6.so)。因此,即使编译/链接工作,当Python测试模块时,它使用动态库,我在LD_LIBRARY_PATH中没有tcl / lib和tk / lib。一旦我添加了这些,它一切正常。

总结: 我必须通过CPPFLAGS

添加以下包含路径
  • /path_to/sqlite3/include
  • /path_to/tcl/include
  • /path_to/tk/include

通过LDFLAGS

的以下lib路径
  • /path_to/sqlite3/lib
  • /path_to/tcl/lib
  • /path_to/tk/lib

以及通过LD_LIBRARY_PATH的以下lib路径:

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

所有这一切,一切正常。