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

Ame*_*ina 5 python tkinter

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

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 - 启用共享'

然后

make
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

建立'_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 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/_tk​​inter.so

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

奇怪的是我能看到libtk8.6.so.它实际上/opt/tcl8.6.0/lib正如我指定的那样LDFLAGS.

为什么编译失败了?

Ame*_*ina 5

setup.py在Python尝试导入时,在安装期间会发生此问题_tkinter.如果你看一下这个函数build_extension,有一个块说:

imp.load_dynamic(ext.name, ext_filename)
Run Code Online (Sandbox Code Playgroud)

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

总结:我必须添加以下包含路径 CPPFLAGS

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

以下的lib路径 LDFLAGS

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

以及以下lib路径LD_LIBRARY_PATH:

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

有了这一切,一切都奏效了.