9
16
2013
64

为 Kindle 交叉编译 Zsh 和 Python 3.3

本文来自依云's Blog,转载请注明。

一些天前,根据加州旅客的文章《kindle paperwhite越狱更换屏保》获得了自己的 Kindle Paperwhite 的 root 权限,就开始想着给它编译些东西了。恰巧小虾也在玩交叉编译,而且是 Python,于是自己也照着编译。

交叉编译 Zsh

交叉编译 Python 比编译 zsh 要难不少,所以,先简要说一下 zsh 等能够「无障碍交叉编译」的使用 Autotools 构建系统的软件是怎么编译的。

首先,弄清楚几个概念。「host」是指程序要运行的目标平台,「build」是指编译该程序的平台,而在编译编译器时会遇到的「target」则指的是其生成的文件所运行的平台。(参见CLFS 构建手册

其次,得找个交叉编译器。有些发行版可能仓库里就有。但是 Arch 没有,所以我还是用的 zshaolin 的这个工具链。下回来解压了,把它的bin目录加到$PATH里。Zsh 里可以这么写:

path+=/path/to/arm-dyne-gcc_64bit-x-arm7a-21jan12/bin

然后就可以去 zsh 源码目录下开始编译啦。还是那三步,只是参数有些不一样而已:

mkdir build-arm && cd build-arm
../configure --host=arm-dyne-linux-gnueabi --enable-multibyte --enable-pcre --with-term-lib='ncursesw'
make
make DESTDIR=/kindle/software/zsh-5.0.2 install

且慢!我指定了--enable-pcre,却没有去检查自己是否有这个库。可能是 bug 吧,zsh 的 configure 脚本并没有检测到我其实没有 pcre 的 ARM 版库文件,于是它接着在很多检测过程中加入了-lpcre,导致检测结果与实际不符(比如它认为我的目标系统上没有setpgid()函数)。编译安装 pcre 到工具链的 sysroot 下后再次编译通过。

再编译一些需要的库

所以你看,使用 Autotools 构建系统的软件交叉编译起来挺容易的,加上需要的--host参数就好了。其它诸如 file、ncurses、readline 也是这么编译安装的。下边说说那些比较「个性」的软件的编译参数。它们基本上都必须在源码目录编译。

首先是 zlib:

CHOST=arm-dyne-linux-gnueabi ./configure
make && make DESTDIR=/kindle/software/zlib-1.2.8 install

TLS/SSL 很有用!OpenSSL:

CC=arm-dyne-linux-gnueabi-gcc LD=arm-dyne-linux-gnueabi-ld AR=arm-dyne-linux-gnueabi-ar RANLIB=arm-dyne-linux-gnueabi-ranlib ./Configure shared linux-armv4
make
make INSTALL_PREFIX=/ldata/media/temp/kindle/software/openssl-1.0.1e install_sw

注意最后不是make install哦,那个会安装一堆不需要的文档的。

对了,我好像忘记说了,以上软件make install之后的操作

  1. 删除文档,比如 rm -rf share/man
  2. 复制到工具链的 sysroot 下,命令:
    tar c . | tar xv -C /path/to/arm-dyne-gcc_64bit-x-arm7a-21jan12/arm-dyne-linux-gnueabi/sysroot
    
  3. 给二进制文件们减肥啦(以下命令需要 zsh;非 zsher 请自行使用合适的 find 命令代替):
arm-dyne-linux-gnueabi-strip **/*(*)

另外再附上 ncurses 的配置命令好了:

../configure --host=arm-dyne-linux-gnueabi --with-shared --with-normal --without-debug --without-ada --enable-widec --enable-pc-files --prefix=/usr/local

是的,我把软件都安装到/usr/local了。在编译 Python 3.3 时的事实表明,这是给自己找麻烦……

编译 Python 啦

好了,准备工具完毕,我们来真正开始编译 Python 啦

按照小虾的文章,首先修改Modules/Setup.dist文件,把需要的模块去掉注释。一定要把最后的xxsubtype给注释掉!因为它只是很无聊的示例模块……

除了要安装模块对应的程序库外(比如要 curses 模块就得先安装 ncurses 等),还要注意一点:如果开启 readline 支持的话,把它后边的-ltermcap删掉!

开始配置了:

mkdir build-arm && cd build-arm
echo ac_cv_file__dev_ptmx=yes > config.site
echo ac_cv_file__dev_ptc=no >> config.site
export CONFIG_SITE=config.site
../configure --host=arm-dyne-linux-gnueabi --build=arm --enable-shared --disable-ipv6

根据实际 ssh 过去的结果,我的 Kindle 有/dev/ptmx但是没有/dev/ptc,所以往config.site文件里写上那么两句。没办法,交叉编译时脚本不知道目标系统里是否有这两个设备文件。当然,你都设置成no也是没什么问题的。

--build=arm这系统纯粹是 Python 的这个配置脚本要求的,和之前所说的常见使用方法不一样的。IPv6 支持需要的某函数配置脚本找不到,那就禁用掉好了。

配置完成,开始 make?

根据所开启的模块支持不同,在编译过程中很有可能地,你会遇到Parser/pgen无法执行的问题。它被编译成 ARM 版了,当然无法执行了!解决方案是这样子的:

修改pyconfig.hSIZEOF_LONG为正确值(比如 64 位 x86 下是8)。如果已经是对的就不要动了。然后重新生成个本地可运行的pgen

rm Parser/*
make CC=gcc Parser/pgen

接着把pyconfig.h改回去。然后,为了避免pgen被重建,我们让 make 认为pyconfig.h没有被修改过:

touch -t 200001010000 pyconfig.h

继续编译!

如果又出来了架构不对的情况,删除刚刚编译pgen时编译出来的目标文件吧:

rm Parser/*.o
touch -t 210001010000 Parser/pgen

touch pgen 的原因是,不能让 make 又把它编译成本地不能运行的 ARM 架构的了。

架构不对的目标文件可能还有一些,按照错误提示删掉就好了。

最后,要生成 Python 的可执行文件啦!很可能地,你会遇到类似这个的错误(我自己这里的错误信息已经没啦,下边这个由加州旅客提供):

libpython3.3m.a(timemodule.o):在函数‘py_process_time’中:
/home/jiazhoulvke/Python-3.3.2/./Modules/timemodule.c:1076:对‘clock_gettime’未定义的引用
/home/jiazhoulvke/Python-3.3.2/./Modules/timemodule.c:1082:对‘clock_getres’未定义的引用

查阅clock_getres的 man 文档得知:

Link with -lrt (only for glibc versions before 2.17).

于是,复制 make 最后执行的那条链接命令,在后边加上lrt吧。如果crypt没有定义的话,还要加上-lcrypt

终于可以安装啦

接下来,当然是把程序安装到 Kindle 上啦!首先执行个make DESTDIR=xxx install安装到某个目录,然后进去清理下吧:

arm-dyne-linux-gnueabi-strip **/*(*)
cd lib/python3.3
# 删除所有你不想要的模块,比如测试代码(`test`,不是`unitest`哦)、tk/idle,
# 还有 distutils 里一堆乱七八糟的东东

# 删除 Python 源码和 pyc 文件,我们只要 pyo 文件就好啦=w=
rm **/*.pyc?
# 在 zip 文件里 Python 可不认 __pycache__……
perl-rename 's=__pycache__/([^.]+).cpython-33.pyo$=\1.pyo=' **/*.pyo
rmdir **/*(/)
zip -9r ../python33.zip .

然后,把生成的python33.zip放到 Kindle 的/usr/local/lib目录下,Python 二进制文件也放到对应的位置。记住,库文件要使用 tar 而非 scp 来传输!像这样子:

tar c libz.so* | ssh kindle tar xv -C /usr/local/lib

其实不少库 Kindle 上已经有了,比如这里的 zlib。不过很奇怪,使用系统自带的 zlib 运行 Python 时会报如下警告:

python3: /usr/lib/libz.so.1: no version information available (required by /usr/local/lib/libpython3.3m.so.1.0)

另一个我发现无关紧要的警告是让你设置PYTHONHOME环境变量的:

Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]

其实不设置也是没关系的。

哦对了,现在我们的 Python 应该还跑不起来的吧!有可能缺少一点库文件的哦!把之前编译生成的对应的库文件全部拿tar扔到/usr/local/lib下吧。再说一遍,使用scp传输的话软链接会变成其指向的文件,浪费掉 Kindle 上宝贵的存储空间!

库文件扔进去之后,首先确认/etc/ld.so.conf里已经包含了/usr/local/lib,然后执行下ldconfig

终于,我们的 Python 在 Kindle 上跑起来啦!

后记,及下载链接

这个是我编译的 Python 的文件大小:

-rwxr-xr-x 1 root root 5.4K Sep 15 00:15 /usr/local/bin/python3.3
-r-xr-xr-x 1 root root 4.0M Sep 15 00:15 /usr/local/lib/libpython3.3m.so.1.0
-rw-r–r– 1 root root 2.2M Sep 15 00:43 /usr/local/lib/python33.zip

主要支持特性有:SSL、readline、ncurese、zlib、中日编码集、Unicode 数据库等。最后再放百度网盘下载链接(包括好些东东哦)。

最后我要说一句,Kindle 才是真正的 Linux 啊!编译起来如此方便!还各种常见库(包括 glibc、zlib、OpenSSL、GTK 2)都有。想之前给 Android 编译点东西得砍掉多少特性啊!又有多少软件死活编译不成功 :-(

PS: Kindle 虽然也用 Java 的,但是它有 X Window,还有 GTK 2 以及 Awesome 窗口管理器哦~可惜它的 Awesome 没开启 D-Bus 支持。

更新:lxml

今天(2013年9月17日),成功编译了 Python 最著名的 XML 处理模块——lxml。编译方法是,指定CC环境变量,复制python3 setup.py build时出错的那两条编译命令并修改,编译出来目标文件存起来。将CC指定为自己的脚本来「生成」它想要的文件。链接时手动改命令链好就行。

因为有 .so 文件,lxml 不能打成 zip 包。因此我直接将*.pyc*.pyo文件连同.so文件一同复制到 Kindle 的/usr/local/lib/python3.3/lxml下。由于版本不匹配,需要把libxml2.so.2.9.1文件也传到 Kindle 中去,覆盖了 Kindle 中旧版本的库文件,希望不会有问题

Category: Linux | Tags: python zsh 交叉编译 kindle | Read Count: 10132
houqp 说:
Sep 17, 2013 09:25:35 AM

无耻的推荐:
编译一个koreader玩玩吧,哈哈:
https://github.com/koreader/koreader

jiazhoulvke 说:
Sep 17, 2013 09:44:01 AM

"rm Parser/*"
执行这种操作真的没问题吗……XD

Avatar_small
依云 说:
Sep 17, 2013 10:48:08 AM

没问题的,因为我是在源码树里新建了个目录来编译的,所以那里全部是编译生成的文件。

Sunday 说:
Sep 17, 2013 12:25:41 PM

Hi,你的Kindle是?3?4?paperwhite?fire?

Xiaoxia 说:
Sep 17, 2013 12:49:42 PM

恭喜!!!个人认为,python3.3的启动速度比python2.6慢很多。

Avatar_small
依云 说:
Sep 17, 2013 02:50:01 PM

有了!不过没办法打成 zip 包。另外,我只保留了 .pyo,所以似乎得加 -O。这是我整个测试命令——

LD_LIBRARY_PATH=/ldata/txtfiles/src/arm-dyne-gcc_64bit-x-arm7a-21jan12/arm-dyne-linux-gnueabi/sysroot/usr/local/ssl/lib:/ldata/media/temp/kindle/software/python-3.3.2-cleanup/usr/local/lib:/ldata/txtfiles/src/arm-dyne-gcc_64bit-x-arm7a-21jan12/arm-dyne-linux-gnueabi/sysroot/usr/local/lib PYTHONHOME=/ldata/media/temp/kindle/software/python-3.3.2-cleanup/usr/local qemu-arm -L /ldata/txtfiles/src/arm-dyne-gcc_64bit-x-arm7a-21jan12/arm-dyne-linux-gnueabi/sysroot /ldata/media/temp/kindle/software/python-3.3.2-cleanup/usr/local/bin/python3.3 -O

回去再在 Kindle 上实际测试下,需要的话我把 .pyc 也留着好了。

编译过程有点纠结,因为设置 CC 后,Python 调用的 gcc 命令还是不对,要手动改了,然后写个脚本来骗 setup.py: http://p.vim-cn.com/cbft/python

其它的,我回去测试完毕后更新吧=w=

Avatar_small
依云 说:
Sep 17, 2013 02:52:22 PM

但是 Python 3.3 的语法、标准库和多字节字符支持比 Python 2 好很多哇。

jiazhoulvke 说:
Sep 17, 2013 02:56:06 PM

说得我头都晕了……

Avatar_small
依云 说:
Sep 17, 2013 09:52:30 PM

已经传到网盘了,你可以试试看=w=

jiazhoulvke 说:
Sep 17, 2013 11:03:16 PM

你那里可以正常使用吗?我的报错了……
>>> import lxml
>>> import lxml.html
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.3/site-packages/lxml/html/__init__.py", line 42, in <module>
ImportError: /lib/libc.so.6: version `GLIBC_2.15' not found (required by /lib/libxml2.so.2)

我下午的时候已经自行编译了libxml2.9.0,而且全部复制过去了……

[root@kindle lxml-3.2.3-cleanup]# file /lib/libxml2.so.2
/lib/libxml2.so.2: symbolic link to `libxml2.so.2.9.0'
[root@kindle lxml-3.2.3-cleanup]# file /lib/libxml2.so
/lib/libxml2.so: symbolic link to `libxml2.so.2.9.0'

jiazhoulvke 说:
Sep 17, 2013 11:30:10 PM

全部链接到你的libxml2.9.1就可以了……

Avatar_small
依云 说:
Sep 17, 2013 11:30:37 PM

glibc 版本不符合要求呗……我在链接 leafpad 时遇到了,Kindle 上的 cairo 库要求的我的交叉编译工具链没有……

Avatar_small
依云 说:
Sep 17, 2013 11:34:49 PM

你是改链接的啊。我是把库文件放到 /usr/local/lib 来覆盖的。

jiazhoulvke 说:
Sep 17, 2013 11:39:19 PM

leafpad不是已经有人编译出来了吗?
http://www.mobileread.com/forums/showpost.php?p=2414588&postcount=11
用是可以用的,不过不能输入中文。

Avatar_small
依云 说:
Sep 17, 2013 11:53:54 PM

装上啦……我只是想先编译个小的 GTK 程序试试嘛,结果各种版本不一致…………

jiazhoulvke 说:
Sep 17, 2013 11:56:37 PM

唉,最好的方式还是直接往kindle里移植个gcc,就没这么多问题了,不过kindle的空间太小了……

Avatar_small
依云 说:
Sep 18, 2013 12:05:36 AM

不光磁盘空间不够,CPU 和内存也会不够的。最好的方式是按 Kindle 上软件的版本自己在系统上弄一套(库文件可以复制 Kindle 的,头文件大部分可以使用同版本的主机系统上的)。

jiazhoulvke 说:
Sep 18, 2013 12:20:23 AM

好吧……这个工程有点大,我不敢去想了。

evilbeast 说:
Sep 18, 2013 04:04:08 PM

都在玩交叉编译啊, 我就觉得python3一个功能很酷, 虽然没多大用处

def add(x:int, y:int) -> int:
return x + y

Avatar_small
依云 说:
Sep 18, 2013 05:06:25 PM

这个有用的呀。你看不少动态语言的 IDE 发明一些注释来标注函数的参数和返回值类型呢。Python 3 这样子就提供了统一的函数标注方案。

endle 说:
Oct 08, 2013 08:08:21 AM

不知道我可怜的 kindle 的 CPU 承受能力如何

perfectKuang 说:
Oct 14, 2013 06:33:13 PM

你好,能请教一下你是怎么在交叉编译Python之后,再安装lxml模块的吗?
我现在通过python setup.py install 就一直提示找不到libxslt中的文件,但是我的libxml2 libxslt 都已经安装了,谢谢了。

Avatar_small
依云 说:
Oct 14, 2013 07:02:17 PM

build 完之后,在 build 目录里找到相关文件直接复制过去啦。

perfectKuang 说:
Oct 15, 2013 08:29:53 AM

谢谢啊!
我执行python setup.py install语句的时候也出错,观察了下,在我的编译开发环境目录下没有libxslt,只出现了libxml2。系统上(并非交叉编译开发环境目录)倒是安装了libxslt,我是不是得用交叉编译重新编译一个新的libxslt?

Avatar_small
依云 说:
Oct 15, 2013 10:38:08 AM

是的。或者,你把目标系统上的 libxslt 库复制到你交叉编译环境中也可以。如果缺少头文件的话就自己按照 libxslt 的版本去找一下。

perfectKuang 说:
Oct 15, 2013 08:20:47 PM

谢谢了,
1,目标系统是不是目标嵌入式系统?我现在的系统上有一个专门的workspace目录用于存放交叉编译的文件的(这个不是我自己搞的,新手,很多东西都是现学,唉)。
2,然后系统上通过源码默认(并非交叉编译)安装了libxslt,libxml2,比如在/usr/lib上就有相应的库文件,是不是把相应的Libxslt库复制到编译环境中?
3,如果复制的话,交叉编译i686-linux-gcc如何识别libxslt放在哪里?要修改环境变量吗?
4,看会linux编译原理去,祝有个好的夜晚。

perfectKuang 说:
Oct 15, 2013 08:32:06 PM

还有,能不能介绍一定关于交叉编译方面的资料啊,我现在因为一直卡在交叉编译阶段,无法进入脚本代码的编写及学习阶段,谢谢了。

Avatar_small
依云 说:
Oct 15, 2013 09:30:33 PM

目标系统指的是你编译出来的东西所要运行的系统。你这里是嵌入式系统,但交叉编译泛指编译其它系统上的本地代码,比如我也在 Linux 下交叉编译 win32 程序。

交叉编译时所使用的库文件是你的目标系统上的版本(native)。和编译机上的没有关系。一般它应该放在 <sysroot>/lib 之类的地方,或者使用 -L 等参数告诉编译器。gcc -print-sysroot 参数会告诉你 <sysroot> 在哪里。

关于交叉编译的资料,可以看看 CLFS 的手册,比如这个: http://docs.python.org/3/tutorial/ 。

另外,交叉编译和脚本代码有什么关联么?

perfectKuang 说:
Oct 16, 2013 03:02:20 PM

谢谢了!
1,那我还是得交叉编译libxslt然后再将它的库以及头文件拷贝到开发环境中。
2,《sysroot>是如何查看的,我这里查看不了,只能通过命令:
echo 'main(){}'|i686--linux-gnu-gcc -E -v -查看到头文件的搜索路径,至于库文件搜索路径,不知道如何显示。
3,脚本代码是我后期要完成的任务,现在只不过要交叉编译一个软件

perfectKuang 说:
Oct 16, 2013 03:15:02 PM

xsltutils.c: In function 'xsltSaveResultTo':
xsltutils.c:1542: warning: passing argument 1 of 'xmlBufferWriteQuotedString' from incompatible pointer type
xsltutils.c:1555: warning: passing argument 1 of 'xmlBufferWriteQuotedString' from incompatible pointer type
xsltutils.c: In function 'xsltSaveResultToString':
xsltutils.c:1760: error: dereferencing pointer to incomplete type
xsltutils.c:1761: error: dereferencing pointer to incomplete type
xsltutils.c:1763: error: dereferencing pointer to incomplete type
xsltutils.c:1764: error: dereferencing pointer to incomplete type
make[2]: *** [xsltutils.lo] 错误 1
1,交叉编译libxslt时,make时出现这种错误,请问你碰到过吗?没碰到过就算了。
2,我的配置这样:
./configure --host=i686-linux CC=i686-linux-gcc --prefix=/my/libxslt LDFLAGS=-L/my/libxml2/lib CFLAGS=-I/my/libxml2/include

Avatar_small
依云 说:
Oct 16, 2013 05:56:23 PM

i686-linux-gcc -print-sysroot 用这个命令来打印 sysroot。参见 man gcc。

Linux / i686 你也要交叉编译吗……那个错误的信息不太完整,我也不知道是哪里出的错。

另,前边 CLFS 手册的地址给错了,应该是 http://cross-lfs.org/view/CLFS-2.0.0/x86/ 。

perfectKuang 说:
Oct 17, 2013 08:19:43 AM

谢谢了!
1,我那个目标系统是X86的。
2,能不能给我邮件发一个你是怎么安装lxml模块的过程啊?(kuang15222105285@163.com)
3,我执行python setup.py install提示好多关于libxslt和libxml2的头文件未安装————之后我交叉编译安装了就版本的libxml2.7.8及libxslt,就提示上面的bug——之后安装了libxml2.9.0,现在交叉编译libxslt1.1.27又提示找不到crypto.h——得把全部的crypto升级了——可是安装crypto还得安装好多的java文件,我都快疯啦!

Avatar_small
依云 说:
Oct 17, 2013 10:36:42 AM

crypto.h 是 openssl 的,所以你得交叉编译它了。这也不是个省事的家伙(记得是需要手工修改编译命令还是什么)。

头文件找不到你就帮它找呗,找到之后用 -I 选项告诉它位置。

不过,既然是 x86 系统,直接使用预编译好的文件不行吗?又或者,你的编译系统不是 x86 的么?真的需要交叉编译吗?

perfectKuang 说:
Oct 17, 2013 11:56:03 AM

谢谢了。
恩恩,必须得交叉编译,我现在弄好libxml2和libxslt了
1,你交叉编译lxml的时候是源码安装的吗?
2,你是怎么做的啊?

Avatar_small
依云 说:
Oct 17, 2013 12:47:16 PM

是源码安装的。一个个依赖慢慢编译呗……

perfectKuang 说:
Oct 17, 2013 12:56:01 PM

谢谢了啊
原来是源码安装的啊!
安装完之后,如何将lxml程序拷贝到Python目录下啊?

perfectKuang 说:
Oct 17, 2013 01:09:27 PM

1,如果交叉编译完一个程序后,你是如何将库和头文件放入开发环境目录下的啊?
2,你如何查询交叉编译开发环境中库的查找路径啊?
3,echo 'main(){}'|i686--linux-gnu-gcc -E -v -查看到头文件的搜索路径,但是库文件呢?
谢谢了啊!

Avatar_small
依云 说:
Oct 17, 2013 01:25:10 PM

autotools 构建系统的软件可以使用 make DESTDIR=xxx install 安装,其中 xxx 是你编译器的 sysroot。库文件通常在 sysroot 下的 lib, usr/lib 下。你可以用 xxx-gcc -print-search-dirs 来查看。

至于拷贝方法,用 cp 呗。

perfectKuang 说:
Oct 17, 2013 01:28:05 PM

lxml源码编译时如何做的?我没有任何头绪,能不能给点提示吗?lxml源码中没有configure啊,谢谢了啊。

Avatar_small
依云 说:
Oct 17, 2013 01:39:45 PM

使用 python setup.py build 时它会打印出编译命令的。

perfectKuang 说:
Oct 21, 2013 12:46:39 PM

能不能发个邮件,告知下lxml如何安装,以及需要的模块,我一直弄不上!真的谢谢了。

Avatar_small
依云 说:
Oct 21, 2013 01:58:39 PM

过程都比较常规,编译依赖一大堆,我也都忘记啦。

perfectKuang 说:
Oct 22, 2013 09:12:23 AM

好吧,谢谢了啊!

perfectKuang 说:
Oct 24, 2013 10:30:11 AM

你好,再麻烦你一下!
如果python交叉编译好了之后,缺少一些模块如(openssl),此时如何交叉编译这个模块?
1,我的做法是:
cd pyOpenSSL
python setup.py install.请问这样可以吗?

Avatar_small
依云 说:
Oct 24, 2013 10:41:49 AM

是 _ssl 模块还是 pyopenssl?后者的话,和 lxml 差不多,需要手动修改编译命令什么的。

perfectKuang 说:
Oct 24, 2013 10:48:40 AM

不是_ssl。是pyopenssl.
1,手动修改编译命令?下载下来的代码里面就只有setup.py,这个如何手动修改编译命令?
2,我在安装lxml的时候就先交叉编译libxml2和libxslt,之后:
cd lxml
python setup.py install.这样就可以了啊?
3,不过pyOpenssl就回产生问题,所以想问下你python模块式如何编译安装的?

Avatar_small
依云 说:
Oct 24, 2013 12:18:46 PM

是什么错误消息呢?

你要不加我的 XMPP/gtalk?地址是 lilydjwg@gmail.com

perfectKuang 说:
Oct 25, 2013 07:59:14 AM

谢谢啦!

carlhan 说:
Nov 14, 2013 10:32:06 PM

我就想看看 评论框能有多窄

Avatar_small
依云 说:
Nov 14, 2013 11:40:17 PM

哈哈哈~你自己用 Firebug 调下看啦 =w=

perfectKuang 说:
Nov 16, 2013 11:48:43 PM

确实很小了,问题已经全部搞定了,等这个项目做完,我也写个总结去。

lion 说:
Jul 24, 2014 02:59:02 PM

现在可以执行,但是如果把.py 编译成.pyo 就不能运行,有以下错误:
Fatal Python error: Py_Initialize: Unable to get the locale encoding
LookupError: no codec search functions registered: can't find encoding
Aborted

但是.pyc是运行正常的,请问如何解决?

Avatar_small
依云 说:
Jul 24, 2014 06:37:52 PM

启动 Python 时加选项 -O。

lion 说:
Jul 25, 2014 09:24:32 AM

感恩!解决问题了,十分感谢。
还想请问一下,有什么好的书籍或者网站,可以学习payton的?

Avatar_small
依云 说:
Jul 25, 2014 12:05:18 PM

这里有教程: http://docs.python.org/3/tutorial/

lion 说:
Jul 27, 2014 07:07:53 AM

好的,谢谢啦

Titan 说:
Dec 20, 2014 10:35:59 PM

你好,我在开发板上编译成功了zsh,但是有个奇怪的现象。

用zsh的时候,退格键的功能应该是删除光标左边的字符,然后光标向左移一格;

但我现在的情况是:确实是删除了左边的字符,但光标是向右移动的;方向键上应该是显示上一条命令,但并不是从最左边开始显示,而是接着原先的内容继续显示下去。

概括的说就是 之前输入的内容不能正确的从屏幕上清除(实际上清除了),能理解我的意思吗?

想请问一下,你又有什么解决办法吗?谢谢!

Titan 说:
Dec 20, 2014 10:59:26 PM

http://askubuntu.com/questions/54145/how-to-fix-strange-backspace-behaviour-with-urxvt-zsh

我遇到的是与他同样的问题,但是我没办法按照他的办法解决,因为没有图形界面=。=

Avatar_small
依云 说:
Dec 20, 2014 11:35:42 PM

终端的问题。把相应的 terminfo 文件复制到对应的地方(具体位置取决于你的配置,或者设置 TERMINFO 环境变量),然后把 TERM 环境变量设置成对应的值就可以了。

Titan 说:
Dec 21, 2014 01:15:59 PM

多谢!终于解决了。
我的步奏是:
1.将PC 上 /usr/share/terminfo 拷贝至开发板上。
2.修改~/.zshrc, 添加
export TERMINFO=/usr/share/terminfo
export TERM=xterm-256color
3.重新登录,解决!

之前遇到 oh-my-zsh 找不到 function 也是因为环境变量设置的关系。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

部分静态文件存储由又拍云存储提供。 | Theme: Aeros 2.0 by TheBuckmaker.com