交叉编译 python彩民之家论坛9066777

2019-10-12 20:05 来源:未知

4.dir

你是否想过如何查看 Python 对象内部及其具有哪些属性?

输入以下命令行:

>>> dir()
>>> dir("Hello World")
>>> dir(dir)

当以交互方式运行 Python 时,这可能是一个非常有用的功能,并且可以动态地探索你正在使用的对象和模块。

想要了解更多,点这里:https://docs.python.org/3/library/functions.html#dir

 

它有大量的模块和库

编译本地 Python 与 pgen

用于生成 grammar 所需要文件用。

cd build-pc

../configure CC=gcc CXX=g   AR=ar RANLIB=ranlib LDFLAGS="-L/usr/lib -L/usr/lib64 -L/usr/local/lib -L/usr/local/lib64" CFLAGS="-I/usr/include -I/usr/local/include"

make python Parser/pgen

16.pprint

Python 的默认 print 函数就可以实现打印功能。但如果尝试打印较大的嵌套对象,就会发现打印结果很丑。

这时 Python 标准库的 pretty printer 模块就可以发挥作用了。该模块可以将复杂的结构化对象以一种易读的格式打印出来。

pretty printer 模块:https://docs.python.org/3/library/pprint.html

Python 开发者的必备技能之一就是处理复杂的数据结构。

import requests
import pprint
url = 'https://randomuser.me/api/?results=1'
users = requests.get(url).json()
pprint.pprint(users)

 

collections

创建 build 目录

在 python 源代码下创建 build-pcbuild-mips 目录,分别用于编译 PC pgen(交叉编译时用到)与交叉编译 mips python。该目录做 configure、make、make install,编译时用于保存临时生成的文件,保证 python 源代码干净。

22.虚拟环境(Virtual environment)

这可能是 Python 中我最喜欢的事物了。

你可能同时处理多个 Python 项目。不幸的是,有时候两个项目依赖于相同依赖项的不同版本。那你要安装哪个版本呢?

幸运的是,Python 支持虚拟环境,这使得用户能够充分利用两种环境。见下列行:

python -m venv my-project
source my-project/bin/activate
pip install all-the-modules 

  

现在你在一台机器上具备独立的多个 Python 版本了。问题解决!

 

您可以在此处详细了解如何使用它们。numbers = [1,2,3,4,5,6,7]

导入交叉编译 patch

参考自 python-2.7-001-support-for-build.patch,2.7.11 的修改地方有稍微变化,详见如下 patch。

Python 虽然使用 autoconf,但是事实上代码中已经包含 configure 文件,因此下文代码给出的是修改 configure.ac 并执行 autoconf 后生成的 configure 文件。

patch 的使用方法,在 python 源代码根目录下执行:

patch -p1 < ../0001-cross-compile.patch

python 2.7.11 交叉编译 patch:

diff --git a/Makefile.pre.in b/Makefile.pre.in
index ee73edd..730db7e 100644
--- a/Makefile.pre.in
    b/Makefile.pre.in
@@ -237,7  237,8 @@ LIBFFI_INCLUDEDIR=  @LIBFFI_INCLUDEDIR@

 ##########################################################################
 # Parser
-PGEN=      Parser/pgen$(EXE)
 BUILDPGEN=     Parser/pgen$(EXE)
 PGEN_FOR_BUILD=    @PGEN_FOR_BUILD@

 PSRCS=     
        Parser/acceler.c 
@@ -635,14  636,14 @@ Modules/pwdmodule.o: $(srcdir)/Modules/pwdmodule.c $(srcdir)/Modules/posixmodule

 $(GRAMMAR_H): $(GRAMMAR_INPUT) $(PGENSRCS)
        @$(MKDIR_P) Include
-       $(MAKE) $(PGEN)
-       $(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
        $(MAKE) $(BUILDPGEN)
        $(PGEN_FOR_BUILD) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
 $(GRAMMAR_C): $(GRAMMAR_H) $(GRAMMAR_INPUT) $(PGENSRCS)
        $(MAKE) $(GRAMMAR_H)
        touch $(GRAMMAR_C)

-$(PGEN):   $(PGENOBJS)
-       $(CC) $(OPT) $(LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
 $(BUILDPGEN):  $(PGENOBJS)
        $(CC) $(OPT) $(LDFLAGS) $(PGENOBJS) $(LIBS) -o $(BUILDPGEN)

 Parser/grammar.o:  $(srcdir)/Parser/grammar.c 
                $(srcdir)/Include/token.h 
diff --git a/configure b/configure
index 7dab897..bf16c0e 100755
--- a/configure
    b/configure
@@ -734,6  734,7 @@ UNIVERSALSDK
 CONFIG_ARGS
 SOVERSION
 VERSION
 PGEN_FOR_BUILD
 PYTHON_FOR_BUILD
 host_os
 host_vendor
@@ -2911,6  2912,13 @@ else
 fi


 if test "$cross_compiling" = yes; then
     PGEN_FOR_BUILD="${PGEN_FOR_BUILD}"
 else
     PGEN_FOR_BUILD='$(BUILDPGEN)'
 fi
 
 

 if test "$prefix" != "/"; then
     prefix=`echo "$prefix" | sed -e 's//$//g'`
@@ -6334,6  6342,12 @@ fi


 # Enable PGO flags.
 
 
 
 
 
 
 # Extract the first word of "llvm-profdata", so it can be a program name with args.
 set dummy llvm-profdata; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-- 
1.9.1

8.howdoi

陷入编码问题,却不记得以前见过的解决方案?需要检查 StackOverflow,但不想离开终端?

那么你需要这个有用的命令行工具:https://github.com/gleitz/howdoi

$ pip install howdoi

无论你有什么问题都可以问它,它会尽力回答。

$ howdoi vertical align css
$ howdoi for loop in java
$ howdoi undo commits in git

但是请注意——它会从 StackOverflow 的最高票答案中抓取代码。也就是说它提供的信息并非总是有用……

$ howdoi exit vim

 

sh.echo('This is great!')

问题

24.xkcd

humour 是 Python 语言的一个关键特征,其名称来自英国喜剧片《蒙提·派森的飞行马戏团》(Monty Python and the Flying Circus)。Python 的很多官方文档引用了该喜剧片最著名的剧情。

幽默感并不限于文档。试着运行下列行:

import antigravity

  

将打开 xkcd 画的 Python 漫画。不要改变这一点,Python。不要改变。

 

newspaper3k

附一:Python 内建模块功能说明

直接引自 定制 Python 嵌入 C : (四) 定制 Python 内建模块,内容可能已过时,不过有参考价值。

  1. array (Modules/arraymodule.c) (http://docs.python.org/library/array.html) 一个可以存放基本类型的高效数组, 提供了和序列类似的操作. 使用放法类似于 a = array.array('b', [10, 20, 30]), 不常使用, 可以考虑去除.
  2. _ast (Python/Python-ast.c) (http://docs.python.org/library/ast.html) 抽象语法树, 供 Python 程序解析处理 Python 语法相关的库, 这个模块的源代码是由脚本自动生成的. 由于 Python-ast.c 本身还会被解释器的其它地方引用, 不能删除, 所以, 如果是为了压缩解释器大小, 保留这个库也没关系. 如果是为了定制 python 的功能, 也可以屏蔽这个库, 但是源代码需要保留, 不能从工程中删掉.
  3. audioop (Modules/audioop.c) (http://docs.python.org/library/audioop.html) 一个音频处理的库, 仅 Win32 平台有效.
  4. binascii (Modules/binascii.c) (http://docs.python.org/library/binascii.html) 提供二进制和 ASCII 码的转换, 会被 uu, base64, binhex 这些库引用. 建议保留.
  5. cmath (Modules/cmathmodule.c) (http://docs.python.org/library/cmath.html) 提供复数操作的函数
  6. errno (Modules/errnomodule.c) (http://docs.python.org/library/errno.html) 提供标准的错误码定义, 在很多地方中都会使用, 需要保留.
  7. future_builtins (Modules/future_builtins.c) (http://docs.python.org/library/future_builtins.html) 对那些在 Python2.x 和 Python3 中都有但是意义不一样的函数提供的包装. 使用这里面的函数可以保证调用了正确的版本的函数.
  8. gc (Modules/gcmodule.c) (http://docs.python.org/library/gc.html) Python 的垃圾收集接口. 当然保留.
  9. imageop (Modules/imageop.c) (http://docs.python.org/library/imageop.html) 一些图像处理的函数.
  10. math (Modules/mathmodule.c) (http://docs.python.org/library/math.html) 提供了 C 标准库中的那些数学函数.
  11. _md5 (Modules/md5module.c) 提供了 MD5 算法.
  12. nt (Modules/posixmodule.c) 一些操作系统习惯的函数, 比如打开文件等等.
  13. operator (Modules/operator.c) (http://docs.python.org/library/operator.html) 提供了操作符的等价函数
  14. signal (Modules/signalmodule.c) (http://docs.python.org/library/signal.html) 信号机制, 提供异步事件的回调.
  15. _sha, _sha256, _sha512 三种 SHA 的加密算法模块.
  16. strop (Modules/stropmodule.c) 提供了一些优化的字符串操作.
    17.time (Modules/timemodule.c) (http://docs.python.org/library/time.html) 时间操作库.
  17. thread (Modules/threadmodule.c) Python 线程的底层模块, threading 会使用 thread 库.
  18. cStringIO (Modules/cStringIO.c) (http://docs.python.org/library/stringio.html) StringIO 的高效版本.
  19. cPickle (Modules/cPickle.c) (http://docs.python.org/library/pickle.html) Python 的序列化模块.
  20. msvcrt (PC/msvcrtmodule.c) (http://docs.python.org/library/msvcrt.html) VC 运行时库的包装, 包括一些文件和屏幕操作函数.
  21. _locale (Modules/_localemodule.c) 提供本地化支持的模块.
  22. _subprocess (PC/_subprocess.c) (http://docs.python.org/library/subprocess.html) 操作子进程的库, 平台相关的.
  23. _codecs (Modules/_codecsmodule.c) (http://docs.python.org/library/codecs.html) 定义了 Python 的编码器相关接口.
  24. _weakref (Modules/_weakref.c) (http://docs.python.org/library/weakref.html) 创建对象的弱引用.
  25. _hotshot (Modules/_hotshot.c) (http://docs.python.org/library/hotshot.html) 类似于 Profiler 模块, 而且将来可能被移除, 现在把它去掉也不错.
  26. _random (Modules/_randommodule.c) 随机数模块.
  27. _bisect (Modules/_bisectmodule.c) (http://docs.python.org/library/bisect.html) 一个基于二分算法, 可以让插入一个数据岛排序的序列后序列仍然有序的库.
  28. _heapq (Modules/_heapqmodule.c) (http://docs.python.org/library/heapq.html) 实现堆栈数据结构算法的库.
  29. _lsprof (Modules/_lsprof.c) (http://docs.python.org/library/profile.html) Profiler 模块, 统计程序执行的性能.
  30. itertools (Modules/itertoolsmodule.c) (http://docs.python.org/library/itertools.html) 一些迭代器操作的模块.
  31. _collections (Modules/_collectionsmodule.c) (http://docs.python.org/library/collections.html) 提供了几个高级的容器类.
  32. _symtable (Modules/symtablemodule.c) (http://docs.python.org/library/symtable.html) 符号表管理模块.
  33. mmap (Modules/mmapmodule.c) (http://docs.python.org/library/mmap.html) 文件内存映射支持模块.
  34. _csv (Modules/_csv.c) (http://docs.python.org/library/csv.html) 为 CSV 模块的内部支持. CSV 模块提供了读写 CSV 文件的功能.
  35. _sre (Modules/_sre.c) 正则表达式的匹配引擎.
  36. parser (Modules/parsermodule.c) (http://docs.python.org/library/parser.html) 操作 Python 语法树的模块.
  37. _winreg (PC/_winreg.c) Windows 注册表操作模块.
  38. _struct (Modules/_struct.c) 提供在 Python 和 C 之间转换数据类型的功能.
  39. datetime (Modules/datetimemodule.c) (http://docs.python.org/library/datetime.html) 日期时间操作函数.
  40. _functools (Modules/_functoolsmodule.c) (http://docs.python.org/library/functools.html) 函数相关操作模块.
  41. _json (Modules/_json.c) (http://docs.python.org/library/json.html) JSON 数据格式操作模块.
  42. xxsubtype (Modules/xxsubtype.c) 这是一个测试相关的模块. 运行 test_descr.py 时会用到.
  43. zipimport (Modules/zipimport.c) 这个模块主要用于从 zip 文件中导入 Python 的模块.
  44. zlib (Modules/zlibmodule.c) 这个模块提供了 zip 压缩和解压功能, 基于 GNU zip 实现.
  45. _multibytecodec, _codecs_cn, _codecs_hk, _codecs_iso2022, _codecs_jp, _codecs_kr, _codecs_tw (Modules/cjkcodecs/*) 这些模块提供了 CJK(中日韩统一表意文字) 的编码和解码. 去掉这部分可以减小 python 解释器 600 多 K.
  46. marshal (Python/marshal.c) (http://docs.python.org/library/marshal.html) 为 Python 对象提供序列化的模块.
  47. imp (Python/import.c) (http://docs.python.org/library/imp.html) 这个模块提供了 Python 里的 import 语句的实现.
  48. main, builtin, sys, exceptions, _warnings 这部分模块在 config.c 设置里只是一个名字占位符.
  49. _io (Modules/_iomodule.c) (http://docs.python.org/library/io.html) 新版本的 Python 输入输出模块, 在 Python 3 中为默认的输入输出处理方法.
  • 易于学习
  • 超高的通用性
  • 具备大量模块和库

zipped = dict(zip(keys, vals))

configure 配置

配置命令如下:
configure 的 prefix 只支持绝对路径。

cd build-mips

../configure --host=mips64-octeon-linux-gnu --build=x86_64-linux-gnu --prefix=/home/sunyongfeng/python-install --disable-ipv6 ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no ac_cv_have_long_long_format=yes PGEN_FOR_BUILD=../build-pc/Parse/pgen

问题:

  • --enable-FEATURE,不清楚有哪些 features ,怎么配置;
  • --enable-PACKAGE,不清楚有哪些 package,怎么配置。

配置完了之后,在 Modules 目录会生成 Setup 文件。x86 的默认编译会编译到必须的模块,而 mips64 的交叉编译很多模块没有编译下,如 socket 等。修改 Modules/Setup 文件,定制想编译的内置模块。以下是基础模块,目前还不清楚如果不想内置的话要如何编译。
定制内置模块,参见这篇博文 《定制 Python 嵌入 C : (四) 定制 Python 内建模块》,讲述各个内置模块的功能。

# Modules that should always be present (non UNIX dependent):                                       

array arraymodule.c # array objects                                                                 
cmath cmathmodule.c _math.c # -lm # complex math library functions                                  
math mathmodule.c _math.c # -lm # math library functions, e.g. sin()                                
_struct _struct.c   # binary structure packing/unpacking                                            
time timemodule.c # -lm # time operations and variables                                             
operator operator.c # operator.add() and similar goodies                                            
_testcapi _testcapimodule.c    # Python C API test module                                           
_random _randommodule.c # Random number generator                                                   
_collections _collectionsmodule.c # Container types                                                 
_heapq _heapqmodule.c       # Heapq type                                                            
itertools itertoolsmodule.c # Functions creating iterators for efficient looping                    
strop stropmodule.c     # String manipulations                                                      
_functools _functoolsmodule.c   # Tools for working with functions and callable objects             
_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c  # elementtree accelerator
#_pickle _pickle.c  # pickle accelerator                                                            
datetime datetimemodule.c   # date/time type                                                        
_bisect _bisectmodule.c # Bisection algorithms                                                      

unicodedata unicodedata.c    # static Unicode character database

10.Jedi

Jedi 库是一个自动完成和代码分析的库。它使代码编写变得更快、效果更高。

除非你正在开发自己的 IDE,否则你肯定会对使用 Jedi 库作为编辑插件很感兴趣。

Jedi:https://jedi.readthedocs.io/en/latest/docs/usage.html

你可能已经在使用 Jedi 了。IPython 项目就使用 Jedi 实现代码自动完成功能。

您还可以定义类型别名:from typing import List

下载、解压 python 源代码

从 python.org 下载。

12.列表推导式(List comprehensions)

我最喜欢 Python 编程的原因之一是它的列表推导式(https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions)。

这些表达式使得编写干净易读的代码变得很容易,那些代码读起来几乎像自然语言一样。

关于它们的更多使用信息请查看:https://www.learnpython.org/en/List_Comprehensions

numbers = [1,2,3,4,5,6,7]
evens = [x for x in numbers if x % 2 is 0]
odds = [y for y in numbers if y not in evens]
cities = ['London', 'Dublin', 'Oslo']
def visit(city):
    print("Welcome to " city)
for city in cities:
    visit(city)

 

sh.mkdir('new_folder')

配置

3.collections

Python 有一些很棒的默认数据类型,但有时候它们可能不会尽如你意。

不过,Python 标准库提供了 collections 模块。这个方便的附加组件可以为你提供更多数据类型。

collections 模块:https://docs.python.org/3/library/collections.html

from collections import OrderedDict, Counter
# Remembers the order the keys are added!
x = OrderedDict(a=1, b=2, c=3)
# Counts the frequency of each character
y = Counter("Hello World!")

   

下面的代码示例inspect.getsource()用于打印自己的源代码。它还inspect.getmodule()用于打印定义它的模块。

附二:Python 最佳编译依赖

直接译自 Python Deployment。

键入如下命令自动安装一些依赖:

$ sudo apt-get build-dep python2.7

确认安装如下列下的其他 -dev 包。

  • python-dev
  • libncurses5-dev
  • libsqlite3-dev
  • libbz2-dev
  • libreadline-dev
  • libdb4.8-dev
  • tcl8.5-dev,tk8.5-dev

下面这个包在 ubuntu 早期版本(如 10.04)并没有自动安装,需确认一下。

  • libssl-dev
  • libexpat1-dev
  • libreadline6-dev
  • libgtk2.0-dev

如果想支持 xml 相关:

  • libxml2-dev
  • libxslt1-dev

如果想支持 MySQLdb (在 pypi 中实际命令为 MySQL-python):

  • libmysqlclient-dev

最终的 make 结果(编译结果)如能如下:

Python build finished, but the necessary bits to build these modules were not found:
_tkinter           bsddb185           dl
gdbm               imageop            sunaudiodev
To find the necessary bits, look in setup.py in detect_modules() for the module's name.

这个编译 log 提示哪些模块没有被编译到,注意其中有一些并不是必需的或过时的:

  • bsddb185: Older version of Oracle Berkeley DB. Undocumented. Install version 4.8 instead.
  • dl: For 32-bit machines. Deprecated. Use ctypes instead.
  • imageop: For 32-bit machines. Deprecated. Use PIL instead.
  • sunaudiodev: For Sun hardware. Deprecated.
  • _tkinter: For tkinter graphy library, unnecessary if you don't develop tkinter programs.

17.Queue

Python 支持多线程,而这是由 Python 标准库的 Queue 模块支持的。

该模块允许用户实现队列(queue)数据结构。队列数据结构允许用户根据特定的规则添加和检索条目。

『First in, first out』 (FIFO) 队列允许用户按照对象被添加的顺序来检索对象。『Last in, first out』 (LIFO) 队列允许用户首先访问最新添加的对象。

最后,优先级队列(priority queue)允许用户根据对象对应的优先级类别来检索对象。

如何使用 queue 在 Python 中实现多线程编程,示例详见:https://www.tutorialspoint.com/python3/python_multithreading.htm。

 

x = OrderedDict(a=1, b=2, c=3)

编译

简单的 make 命令即可。

9.inspect

Python 的 inspect 模块非常有助于理解问题背后的详情。你甚至可以在 inspect 模块上调用其方法!

inspect 模块:https://docs.python.org/3/library/inspect.html

下面的代码示例使用 inspect.getsource() 打印自己的源代码。它还使用 inspect.getmodule() 打印定义它的模块。

最后一行代码打印出自己的行号。

import inspect
print(inspect.getsource(inspect.getsource))
print(inspect.getmodule(inspect.getmodule))
print(inspect.currentframe().f_lineno)

  

当然,除了这些琐碎的用途之外,inspect 模块还能帮助你理解代码正在做的事。你还可以用它编写自文档化代码。

for i,row in enumerate:

安装

命令 make install -i,安装 binlibshareman 等目录至 ./configure 中配置的 prefix 目录。

sunyongfeng@R04220:~/python-install$ ls
bin  include  lib  share
sunyongfeng@R04220:~/python-install$ ls -al *
bin:
总用量 9612
drwxr-xr-x 2 sunyongfeng sunyongfeng    4096  5月 13 16:51 .
drwxr-xr-x 6 sunyongfeng sunyongfeng    4096  5月 15 10:58 ..
-rwxrwxr-x 1 sunyongfeng sunyongfeng     123  5月 13 16:38 2to3
-rwxrwxr-x 1 sunyongfeng sunyongfeng     121  5月 13 16:38 idle
-rwxrwxr-x 1 sunyongfeng sunyongfeng     106  5月 13 16:38 pydoc
lrwxrwxrwx 1 sunyongfeng sunyongfeng       7  5月 13 16:51 python -> python2
lrwxrwxrwx 1 sunyongfeng sunyongfeng       9  5月 13 16:51 python2 -> python2.7
-rwxr-xr-x 1 sunyongfeng sunyongfeng 9793952  5月 13 16:51 python2.7
-rwxr-xr-x 1 sunyongfeng sunyongfeng    1709  5月 13 16:51 python2.7-config
lrwxrwxrwx 1 sunyongfeng sunyongfeng      16  5月 13 16:51 python2-config -> python2.7-config
lrwxrwxrwx 1 sunyongfeng sunyongfeng      14  5月 13 16:51 python-config -> python2-config
-rwxrwxr-x 1 sunyongfeng sunyongfeng   18569  5月 13 16:38 smtpd.py

include:
总用量 12
drwxr-xr-x 3 sunyongfeng sunyongfeng 4096  5月 13 16:51 .
drwxr-xr-x 6 sunyongfeng sunyongfeng 4096  5月 15 10:58 ..
drwxr-xr-x 2 sunyongfeng sunyongfeng 4096  5月 13 16:51 python2.7

lib:
总用量 16312
drwxr-xr-x  4 sunyongfeng sunyongfeng     4096  5月 13 16:51 .
drwxr-xr-x  6 sunyongfeng sunyongfeng     4096  5月 15 10:58 ..
-r-xr-xr-x  1 sunyongfeng sunyongfeng 16670684  5月 13 16:51 libpython2.7.a
drwxr-xr-x  2 sunyongfeng sunyongfeng     4096  5月 13 16:51 pkgconfig
drwxr-xr-x 28 sunyongfeng sunyongfeng    20480  5月 13 16:51 python2.7

share:
总用量 12
drwxr-xr-x 3 sunyongfeng sunyongfeng 4096  5月 13 16:51 .
drwxr-xr-x 6 sunyongfeng sunyongfeng 4096  5月 15 10:58 ..
drwxr-xr-x 3 sunyongfeng sunyongfeng 4096  5月 13 16:51 man
sunyongfeng@R04220:~/python-install$ 

打包放到目标机上,配置目标机的 PATH,加上 python 的 bin 目录。

20.类型提示(Type hints)

Python 是动态语言。在定义变量、函数、类别等时无需指定数据类型。

这有利于缩短开发周期。但是,简单的类型错误(typing issue)导致的运行时错误真的太烦了。

从 Python 3.5 版本开始,用户可以选择在定义函数时开启类型提示。

def addTwo(x : Int) -> Int:
    return x   2

  

你还可以定义类型别名:

from typing import List
Vector = List[float]
Matrix = List[Vector]
def addMatrix(a : Matrix, b : Matrix) -> Matrix:
  result = []
  for i,row in enumerate(a):
    result_row =[]
    for j, col in enumerate(row):
      result_row  = [a[i][j]   b[i][j]]
    result  = [result_row]
  return result
x = [[1.0, 0.0], [0.0, 1.0]]
y = [[2.0, 1.0], [0.0, -2.0]]
z = addMatrix(x, y)

  

尽管非强制,但类型注释可以使代码更易理解。

它们还允许你在运行之前使用类型检查工具捕捉 TypeError。在进行大型复杂项目时执行此类操作是值得的。

 

Python是世界上最受欢迎,最流行的编程语言之一。这有很多原因:

裁剪考虑

  • lib/libpython2.7.a, 16M
  • lib/test, 30M

19.sh

Python 是一种伟大的脚本语言,不过有时使用标准 os 和 subprocess 库会有点棘手。

sh 库提供了一种不错的替代方案。

sh 库:http://amoffat.github.io/sh/

该库允许用户像使用普通函数一样调用任意程序,这对自动化工作流和任务非常有用。

from sh import *
sh.pwd()
sh.mkdir('new_folder')
sh.touch('new_file.txt')
sh.whoami()
sh.echo('This is great!')

 

这是一个如何在Python中使用队列进行多线程编程的示例。

编译依赖

交叉编译的时候,如果没有配置好 CFLAGS、LDFLAGS 之类的变量,可能找不到 python 编译所依赖的头文件或库文件。最终体现在编译的结果(此处可能因不同的变量配置而不同):

Python build finished, but the necessary bits to build these modules were not found:
_bsddb             _curses            _curses_panel   
_sqlite3           _ssl               _tkinter        
bsddb185           bz2                dbm             
dl                 gdbm               imageop         
linuxaudiodev      ossaudiodev        readline        
sunaudiodev        zlib                               
To find the necessary bits, look in setup.py in detect_modules() for the module's name.
  • sqlite3 依赖配置

修改 python 源码根目录下的 setup.py 文件,在 detect_modules 函数下,找到 sqlite3 的头文件配置,添加上交叉编译下的 sqlite3 头文件目录。

        sqlite_inc_paths = [ '/usr/include',                                                        
                             '/usr/include/sqlite',                                                 
                             '/usr/include/sqlite3',                                                
                             '/usr/local/include',                                                  
                             '/usr/local/include/sqlite',                                           
                             '/usr/local/include/sqlite3',                                          
                           ]                                                                        
        if cross_compiling:                                                                         
            sqlite_inc_paths = [ '/home/sunyongfeng/workshop/prjheader/',
                                 '/home/sunyongfeng/workshop/prjheader/sqlite',
                                 '/home/sunyongfeng/workshop/prjheader/sqlite3',
                               ] 
  • ssl 依赖配置

类似 sqlite3,在 setup.py 文件的 detect_modules 函数下,找到 ssl 相关的头文件与库文件配置,添加上交叉编译下的 ssl 头文件与库文件目录。

        # Detect SSL support for the socket module (via _ssl)                                       
        search_for_ssl_incs_in = [                                                                  
                              '/usr/local/ssl/include',                                             
                              '/usr/contrib/ssl/include/',                                          
                              '/home/sunyongfeng/workshop/prjheader/',
                             ]                                                                      
        ssl_incs = find_file('openssl/ssl.h', inc_dirs,                                             
                             search_for_ssl_incs_in                                                 
                             )                                                                      
        if ssl_incs is not None:                                                                    
            krb5_h = find_file('krb5.h', inc_dirs,                                                  
                               ['/usr/kerberos/include'])                                           
            if krb5_h:                                                                              
                ssl_incs  = krb5_h                                                                  
        ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,                                 
                                     ['/usr/local/ssl/lib',                                         
                                      '/usr/contrib/ssl/lib/',                                      
                                      '/home/sunyongfeng/workshop/prjrootfs/lib64'
                                     ] ) 
  • ncurses

维基百科 ncurses(new curses)是一个程序库,它提供了API,可以允许程序员编写独立于终端的基于文本的用户界面。它是一个虚拟终端中的“类GUI”应用软件工具箱。它还优化了屏幕刷新方法,以减少使用远程shell时遇到的延迟。

  • readline

如果 readline 模块编译失败,会导致退格键、方向键等不可用。下面错误中"^"位置是退格键。
交叉编译 python 前需要先编译好 libreadline ,并将头文件和库文件放到默认可索引到的路径。

>>> print "abc"
  File "<stdin>", line 1
    print "abc"
               ^
SyntaxError: invalid syntax
>>> 

21.uuid

生成通用唯一标识符(Universally Unique ID,UUID)的一种快速简单方法就是使用 Python 标准库的 uuid 模块。

uuid 模块:https://docs.python.org/3/library/uuid.html

import uuid
user_id = uuid.uuid4()
print(user_id)

  

这创建了一个随机化后的 128 比特数字,该数字几乎必然是唯一的。

事实上,可以生成 2¹²²可能的 UUID。这个数字超过了 5,000,000,000,000,000,000,000,000,000,000,000,000。

在给定集合中找出重复数字的可能性极低。即使有一万亿 UUID,重复数字存在的概率也远远低于十亿分之一。

 

这是标准库的漂亮打印模块(Standard Library’s pretty-print module)的用武之地。它以易于阅读的格式打印出复杂的结构化对象。

参考文献

  • 定制 Python 嵌入 C : (四) 定制 Python 内建模块
  • build python 2.7.11 for mips
  • Python Deployment
  • How to cross compile python for MIPS
  • python-2.7-001-support-for-build.patch

15.运算符重载(Operator overloading)

Python 支持运算符重载。

它实际上是一个简单的概念。你有没有想过为什么 Python 允许用户使用 运算符来将数字相加,并级联字符串?这就是运算符重载在发挥作用。

你可以使用 Python 的标准运算符号来定义对象,这样你可以在与这些对象相关的语境中使用它们。

class Thing:
    def __init__(self, value):
        self.__value = value
    def __gt__(self, other):
        return self.__value > other.__value
    def __lt__(self, other):
        return self.__value < other.__value
something = Thing(100)
nothing = Thing(0)
# True
something > nothing
# False
something < nothing
# Error
something   nothing

 

您也可以通过调用*zip()它们来“解压缩”对象。

环境变量

目前还不清楚为何 export $PATH 后,运行 python 命令找不到 python lib 库,而且找不到 site 模块。而使用绝对路径访问 python 没有问题。

/tmp/bin # python
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
ImportError: No module named site

/tmp/bin # /tmp/bin/python
Python 2.7.11 (default, May 16 2016, 17:11:59) 
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

通过配置环境变量解决:

export PYTHONHOME=/usr/lib/python2.7
export PYTHONPATH=.:$PYTHONHOME:$PYTHONHOME/site-packages
export PATH=$PATH:$PYTHONHOME:$PYTHONPATH

 1.all or any

Python 非常受欢迎的原因之一是其可读性和表达性。

人们还经常把 Python 笑称为「可执行伪码(executable pseudocode)」。但是,当你可以编写这样的代码时,很难去反驳这种言论:

x = [True, True, False]
if any(x):
    print("At least one True")
if all(x):
    print("Not one False")
if any(x) and not all(x):
    print("At least one True and one False")

  

print("Not one False")

本文来自 我的博客。博客的文章保持更新,此文可能不是最新状态。

本文将分享一些使用 Python 的技巧,顺序按照 A-Z 排列。

除非您正在开发自己的IDE,否则您可能最感兴趣的是将Jedi用作编辑器插件。幸运的是,已经可用了!

配置交叉编译环境变量

比如 CC、CFLAGS、LDFLAGS 等。

18.__repr__

在 Python 中定义一个类别或对象时,以「官方」方式将对象表示为字符串很有用。例如:

>>> file = open('file.txt', 'r')
>>> print(file)
<open file 'file.txt', mode 'r' at 0x10d30aaf0>

  

这使代码 debug 变得简单很多。将字符串添加到类别定义,如下所示:

class someClass:
    def __repr__(self):
        return "<some description here>"
someInstance = someClass()
# prints <some description here>
print(someInstance)

 

print

5.emoji

是的,真的有。请点击这里:https://pypi.org/project/emoji/

$ pip install emoji

 

别以为我不知道你会偷偷试它→→

from emoji import emojize
print(emojize(":thumbs_up:"))

版权声明:本文由彩民之家高手论坛发布于编程技术,转载请注明出处:交叉编译 python彩民之家论坛9066777