1.从源码build Tensorflow2.6.5的源码记录
2.python2å¤å°ï¼
3.Python有多少种版本?
4.概述在Linux下编译安装OpenCV的步骤
从源码build Tensorflow2.6.5的记录
.从源码编译Tensorflow2.6.5踩坑记录,笔者经过一天的源码努力,失败四次后终于成功。源码Tensorflow2.6.5是源码截至.时,能够从源码编译的源码最新版本。
0 - 前期准备
为了对Tensorflow进行大规模修改并完成科研工作,源码scala源码阅读技巧笔者有从源码编译Tensorflow的源码需求。平时更常用的源码做法是在conda环境中pip install tensorflow,有时为了环境隔离方便打包,源码会用docker先套住,源码再上conda + pip安装。源码
1 - 资料汇总
教程参考:
另注:bazel的源码编译可以使用换源清华镜像(不是必要)。整体配置流程的源码根本依据还是官方的教程,但它的源码教程有些点和坑没有涉及到,所以多方材料了解。源码
2 - 整体流程
2.1 确定配置目标
官网上给到了配置目标,和对应的replease源码解析版本匹配关系(这张表里缺少了对numpy的版本要求)。笔者最后(在docker中)配置成功的版本为tensorflow2.6.5 numpy1..5 Python3.7. GCC7.5.0 CUDA.3 Bazel3.7.2。
2.2 开始配置
为了打包方便和编译环境隔离,在docker中进行了以下配置:
2. 安装TensorFlow pip软件包依赖项,其编译过程依赖于这些包。
3. Git Tensorflow源代码包。
4. 安装编译工具Bazel。
官网的介绍:(1)您需要安装Bazel,才能构建TensorFlow。您可以使用Bazelisk轻松安装Bazel,并且Bazelisk可以自动为TensorFlow下载合适的Bazel版本。为便于使用,请在PATH中将Bazelisk添加为bazel可执行文件。(2)如果没有Bazelisk,您可以手动安装Bazel。请务必安装受支持的Bazel版本,可以是如何学好源码tensorflow/configure.py中指定的介于_TF_MIN_BAZEL_VERSION和_TF_MAX_BAZEL_VERSION之间的任意版本。
但笔者尝试最快的安装方式是,到Github - bazelbuild/build/releases上下载对应的版本,然后使用sh脚本手动安装。比如依据刚才的配置目标,笔者需要的是Bazel3.7.2,所以下载的文件为bazel-3.7.2-installer-linux-x_.sh。
5. 配置编译build选项
官网介绍:通过运行TensorFlow源代码树根目录下的./configure配置系统build。此脚本会提示您指定TensorFlow依赖项的位置,并要求指定其他构建配置选项(例如,编译器标记)。
这一步就是选择y/N基本没啥问题,其他参考里都有贴实例。笔者需要GPU的支持,故在CUDA那一栏选择了y,其他部分如Rocm部分就是N(直接按enter也可以)。
6.开始编译
编译完成应输出
7.检查TF是吾爱街机源码否能用
3 - 踩坑记录
3.1 cuda.0在编译时不支持sm_
笔者最初选择的docker是cuda.0的,在bazel build --config=cuda //tensorflow/tools/pip_package:build_pip_package过程中出现了错误。所以之后选择了上面提到的cuda.3的docker。
3.2 问题2: numpy、TF、python版本匹配
在配置过程中,发现numpy、TF、python版本需要匹配,否则会出现错误。
4 - 启示
从源码编译Tensorflow2.6.5的过程,虽然经历了多次失败,但最终还是成功。这个过程也让我对Tensorflow的编译流程有了更深入的了解,同时也提醒我在后续的工作中要注意版本匹配问题。
python2å¤å°ï¼
导读ï¼ä»å¤©é¦å¸CTOç¬è®°æ¥ç»åä½åäº«å ³äºpython2å¤å°çç¸å ³å 容ï¼å¦æè½ç¢°å·§è§£å³ä½ ç°å¨é¢ä¸´çé®é¢ï¼å«å¿äºå ³æ³¨æ¬ç«ï¼ç°å¨å¼å§å§ï¼Python2åPython3æåªäºä¸»è¦åºå«ä½ åºè¯¥æ¯åæ¥è§¦Pythonå§,建议ç´æ¥å¦Python3.x
ä¸é¢æ¯Python2.xä¸3.xçæ¬åºå«:
Pythonç3.0çæ¬ï¼å¸¸è¢«ç§°ä¸ºPythonï¼æç®ç§°Py3kãç¸å¯¹äºPythonçæ©æçæ¬ï¼è¿æ¯ä¸ä¸ªè¾å¤§çå级ã
为äºä¸å¸¦å ¥è¿å¤çç´¯èµï¼Python3.0å¨è®¾è®¡çæ¶å没æèèåä¸ç¸å®¹ã
许å¤é对æ©æPythonçæ¬è®¾è®¡çç¨å¼é½æ æ³å¨Python3.0ä¸æ£å¸¸æ§è¡ã
为äºç §é¡¾ç°æç¨å¼ï¼Python2.6ä½ä¸ºä¸ä¸ªè¿æ¸¡çæ¬ï¼åºæ¬ä½¿ç¨äºPython2.xçè¯æ³ååºï¼åæ¶èèäºåPython3.0çè¿ç§»ï¼å 许使ç¨é¨åPython3.0çè¯æ³ä¸å½æ°ã
æ°çPythonç¨å¼å»ºè®®ä½¿ç¨Python3.0çæ¬çè¯æ³ã
é¤éæ§è¡ç¯å¢æ æ³å®è£ Python3.0æè ç¨å¼æ¬èº«ä½¿ç¨äºä¸æ¯æ´Python3.0ç第ä¸æ¹åºãç®åä¸æ¯æ´Python3.0ç第ä¸æ¹åºæTwisted,py2exe,PILçã
大å¤æ°ç¬¬ä¸æ¹åºé½æ£å¨åªåå°ç¸å®¹Python3.0çæ¬ãå³ä½¿æ æ³ç«å³ä½¿ç¨Python3.0ï¼ä¹å»ºè®®ç¼åç¸å®¹Python3.0çæ¬çç¨å¼ï¼ç¶å使ç¨Python2.6,Python2.7æ¥æ§è¡ã
Python3.0çåå主è¦å¨ä»¥ä¸å 个æ¹é¢:
1.printå½æ°
printè¯å¥æ²¡æäºï¼åè代ä¹çæ¯print()å½æ°ãPython2.6ä¸Python2.7é¨åå°æ¯æè¿ç§å½¢å¼çprintè¯æ³ãå¨Python2.6ä¸Python2.7éé¢ï¼ä»¥ä¸ä¸ç§å½¢å¼æ¯çä»·çï¼
print?"fish"
print?("fish")?#注æprintåé¢æä¸ªç©ºæ ¼
print("fish")?#print()ä¸è½å¸¦æä»»ä½å ¶å®åæ°
ç¶èï¼Python2.6å®é å·²ç»æ¯ææ°çprint()è¯æ³ï¼
from?__future__?import?print_function
print("fish",?"panda",?sep=',?')
2.Unicode(è¿æ¯ä¸ä¸ªæå ¶å¥½çæ¹è¿)
Python2æASCIIstr()ç±»åï¼unicode()æ¯åç¬çï¼ä¸æ¯byteç±»åã
ç°å¨ï¼å¨Python3ï¼æ们æç»æäºUnicode(utf-8)å符串ï¼ä»¥åä¸ä¸ªåèç±»ï¼byteåbytearraysã
ç±äºPython3.Xæºç æ件é»è®¤ä½¿ç¨utf-8ç¼ç ï¼è¿å°±ä½¿å¾ä»¥ä¸ä»£ç æ¯åæ³çï¼
ä¸å½?=?'china'?print(ä¸å½)?
china
Python2.x
str?=?"æç±å京天å®é¨"str'\xe6\x\x\xe7\x\xb1\xe5\x8c\x\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x\xe9\x\xa8'
str?=?u"æç±å京天å®é¨"stru'\u\u\u\u4eac\u\u5b\ue8'
Python3.x
str?=?"æç±å京"str'æç±å京'
3.é¤æ³è¿ç®
Pythonä¸çé¤æ³è¾å ¶å®è¯è¨æ¾å¾é常é«ç«¯ï¼æå¥å¾å¤æçè§åãPythonä¸çé¤æ³æ两个è¿ç®ç¬¦ï¼/å//
é¦å æ¥è¯´/é¤æ³:
å¨python2.xä¸/é¤æ³å°±è·æ们çæç大å¤æ°è¯è¨ï¼æ¯å¦JavaåCåå·®ä¸å¤ï¼æ´æ°ç¸é¤çç»ææ¯ä¸ä¸ªæ´æ°ï¼æå°æ°é¨åå®å ¨å¿½ç¥æï¼æµ®ç¹æ°é¤æ³ä¼ä¿çå°æ°ç¹çé¨åå¾å°ä¸ä¸ªæµ®ç¹æ°çç»æã
å¨python3.xä¸/é¤æ³ä¸åè¿ä¹åäºï¼å¯¹äºæ´æ°ä¹é´çç¸é¤ï¼ç»æä¹ä¼æ¯æµ®ç¹æ°ã
Python2.x:
1?/?21.0?/?2.00.5
Python3.x:
1/20.5
注æçæ¯å¹¶ä¸æ¯èå¼å°æ°é¨åï¼èæ¯æ§è¡flooræä½ï¼å¦æè¦æªåå°æ°é¨åï¼é£ä¹éè¦ä½¿ç¨math模åçtruncå½æ°
python3.x:
import?mathmath.trunc(1?/?2)math.trunc(-1?/?2)4.å¼å¸¸
å¨Python3ä¸å¤çå¼å¸¸ä¹è½»å¾®çæ¹åäºï¼å¨Python3ä¸æ们ç°å¨ä½¿ç¨asä½ä¸ºå ³é®è¯ã
æè·å¼å¸¸çè¯æ³ç±?exceptexc,var?æ¹ä¸º?exceptexcasvarã
使ç¨è¯æ³except(exc1,exc2)asvarå¯ä»¥åæ¶æè·å¤ç§ç±»å«çå¼å¸¸ãPython2.6å·²ç»æ¯æè¿ä¸¤ç§è¯æ³ã
1.å¨2.xæ¶ä»£ï¼ææç±»åç对象é½æ¯å¯ä»¥è¢«ç´æ¥æåºçï¼å¨3.xæ¶ä»£ï¼åªæ继æ¿èªBaseExceptionç对象æå¯ä»¥è¢«æåºã
2.2.xraiseè¯å¥ä½¿ç¨éå·å°æåºå¯¹è±¡ç±»åååæ°åå¼ï¼3.xåæ¶äºè¿ç§å¥è©çåæ³ï¼ç´æ¥è°ç¨æé å½æ°æåºå¯¹è±¡å³å¯ã
å¨2.xæ¶ä»£ï¼å¼å¸¸å¨ä»£ç ä¸é¤äºè¡¨ç¤ºç¨åºé误ï¼è¿ç»å¸¸åä¸äºæ®éæ§å¶ç»æåºè¯¥åçäºæ ï¼å¨3.xä¸å¯ä»¥çåºï¼è®¾è®¡è 让å¼å¸¸åçæ´å ä¸ä¸ï¼åªæå¨é误åççæ åµæè½å»ç¨å¼å¸¸æè·è¯å¥æ¥å¤çã
5.xrange
å¨Python2ä¸xrange()å建è¿ä»£å¯¹è±¡çç¨æ³æ¯é常æµè¡çãæ¯å¦ï¼for循ç¯æè æ¯å表/éå/åå ¸æ¨å¯¼å¼ã
è¿ä¸ªè¡¨ç°åååçæå¨ï¼æ¯å¦ã"æ°æ§æ±å¼"ï¼ãä½æ¯è¿ä¸ªxrange-iterableæ¯æ ç©·çï¼æå³çä½ å¯ä»¥æ ééåã
ç±äºå®çæ°æ§æ±å¼ï¼å¦æä½ ä¸å¾ä» ä» ä¸éåå®ä¸æ¬¡ï¼xrange()å½æ°æ¯range()æ´å¿«ï¼æ¯å¦for循ç¯ï¼ã尽管å¦æ¤ï¼å¯¹æ¯è¿ä»£ä¸æ¬¡ï¼ä¸å»ºè®®ä½ éå¤è¿ä»£å¤æ¬¡ï¼å 为çæå¨æ¯æ¬¡é½ä»å¤´å¼å§ã
å¨Python3ä¸ï¼range()æ¯åxrange()é£æ ·å®ç°ä»¥è³äºä¸ä¸ªä¸é¨çxrange()å½æ°é½ä¸ååå¨ï¼å¨Python3ä¸xrange()ä¼æåºå½åå¼å¸¸ï¼ã
import?timeit
n?=?
def?test_range(n):
return?for?i?in?range(n):
pass
def?test_xrange(n):
for?i?in?xrange(n):
pass
Python2
print?'Python',?python_version()
print?'\ntiming?range()'?
%timeit?test_range(n)
print?'\n\ntiming?xrange()'?
%timeit?test_xrange(n)
Python?2.7.6
timing?range()
?loops,?best?of?3:??s?per?loop
timing?xrange()
?loops,?best?of?3:??s?per?loop
Python3
print('Python',?python_version())
print('\ntiming?range()')
%timeit?test_range(n)
Python?3.4.1
timing?range()
?loops,?best?of?3:??s?per?loop
print(xrange())
---------------------------------------------------------------------------
NameErrorTraceback?(most?recent?call?last)
ipython-input-5-5d8f9bea?in?module()
----?1?print(xrange())
NameError:?name?'xrange'?is?not?defined
6.å «è¿å¶åé¢é表示
å «è¿å¶æ°å¿ é¡»åæ0oï¼åæ¥çå½¢å¼ä¸è½ç¨äºï¼äºè¿å¶å¿ é¡»åæ0bã
æ°å¢äºä¸ä¸ªbin()å½æ°ç¨äºå°ä¸ä¸ªæ´æ°è½¬æ¢æäºè¿å¶å串ãPython2.6å·²ç»æ¯æè¿ä¸¤ç§è¯æ³ã
å¨Python3.xä¸ï¼è¡¨ç¤ºå «è¿å¶åé¢éçæ¹å¼åªæä¸ç§ï¼å°±æ¯0oã
python2.x
0o
python3.x
File?"stdin",?line?1^
SyntaxError:?invalid?token
0o
7.ä¸çè¿ç®ç¬¦
Python2.xä¸ä¸çäºæ两ç§åæ³!=å
Python3.xä¸å»æäº,åªæ!=ä¸ç§åæ³ï¼è¿å¥½ï¼æä»æ¥æ²¡æ使ç¨çä¹ æ¯
8.å»æäºrepr表达å¼``
Python2.xä¸åå¼å·``ç¸å½äºreprå½æ°çä½ç¨
Python3.xä¸å»æäº``è¿ç§åæ³ï¼åªå 许使ç¨reprå½æ°ï¼è¿æ ·åçç®çæ¯ä¸ºäºä½¿ä»£ç çä¸å»æ´æ¸ æ°ä¹ï¼ä¸è¿ææè§ç¨reprçæºä¼å¾å°ï¼ä¸è¬åªå¨debugçæ¶åæç¨ï¼å¤æ°æ¶åè¿æ¯ç¨strå½æ°æ¥ç¨å符串æ述对象ã
def?sendMail(from_:?str,?to:?str,?title:?str,?body:?str)?-?bool:
pass
9.å¤ä¸ªæ¨¡å被æ¹åï¼æ ¹æ®PEP8ï¼
StringIO模åç°å¨è¢«å并å°æ°çio模ç»å ãnew,md5,gopherlibç模å被å é¤ãPython2.6å·²ç»æ¯æ´æ°çio模ç»ã
plex)
2.字符串(str)
3.列表(list)
4.元组(tuple)
5.字典(dict)
6.集合(set)
如果你能够把上面的几个要点都掌握了,那么就算是出售源码包真正地入门了。
python有几个版本Python的3.0版本,常被称为Python,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。
为了不带入过多的累赘,Python3.0在设计的时候没有考虑向下相容。
许多针对早期Python版本设计的程式都无法在Python3.0上正常执行。
为了照顾现有程式,Python2.6作为一个过渡版本,基本使用了Python2.x的语法和库,同时考虑了向Python3.0的迁移,允许使用部分
Python3.0的语法与函数。
python学习网,免费的python学习网站,欢迎在线学习!
新的Python程式建议使用Python3.0版本的语法。
除非执行环境无法安装Python3.0或者程式本身使用了不支援Python3.0的第三方库。目前不支援Python3.0的第三方库有Twisted,
py2exe,PIL等。
大多数第三方库都正在努力地相容Python3.0版本。即使无法立即使用Python3.0,也建议编写相容Python3.0版本的程式,然后使用
Python2.6,Python2.7来执行。
结语:以上就是首席CTO笔记为大家介绍的关于Python有多少种版本的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。
概述在Linux下编译安装OpenCV的步骤
OpenCV是一个计算机视觉库,支持Windows、Linux、MacOS等操作系统。在Linux环境中安装OpenCV主要涉及源码编译。官网的下载链接为opencv.org/releases.htm...
选择最新版本3.2.0,Linux用户需下载zip格式源码。安装所需的软件包包括GCC 4.4.x或更高版本,CMake 2.8.7或更高,Git,GTK+2.x或更高(包括headers),pkg-config,Python 2.6或更高版本及Numpy 1.5或更高版本的开发包,ffmpeg或libav的开发包:libavcodec-dev,libavformat-dev,libswscale-dev。可选包有libtbb2和libtbb-dev,libdc 2.x,libjpeg-dev,libpng-dev,libtiff-dev,libjasper-dev,libdc--dev,CUDA Toolkit 6.5或更高版本。这些包通过apt-get命令直接安装,打开终端,输入相关命令即可。安装完毕后,在解压后的opencv-XXX目录内建立build文件夹,编译的makefiles、project files、object files和output files存放于此。
开始编译,只需三行命令:配置、build和安装。配置命令为:$ cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local 。。参数CMAKE_BUILD_TYPE表示构建类型,有Release和Debug两种;CMAKE_INSTALL_PREFIX指定安装目录,一般为/usr/local。可选参数包括BUILD_DOCS和BUILD_EXAMPLES,前者构建文档,后者构建所有示例。若配置命令无法执行,去掉-D后面的空格。build命令为:make -j7,使用7个线程加速编译。安装命令为:sudo make install。
至此,Linux环境下成功安装OpenCV。为了验证Python环境中的使用情况,可以尝试运行一段代码:读取并显示。代码如下:import cv2image = cv2.imread(“logo.png”, 1)cv2.imshow(“Hello, world!”, image)cv2.waitKey(0)cv2.destroyAllWindows()若在运行时遇到错误,请检查路径是否改为绝对路径。成功运行后,将看到显示的。