关于pip:从源代码构建TensorFlow流程记录

京东科技隐衷计算产品部 曹雨晨为什么从源代码构建通常状况下,间接装置构建好的.whl即可。不过,当须要一些非凡配置(或者闲来无事想领会 TensorFlow 构建过程到底有多麻烦)的时候,则须要抉择从源代码构建TensorFlow。万幸文档凌乱的 TensorFlow 还是善意地为咱们提供了一整页的文档供参考 https://www.tensorflow.org/in... ,集体认为其中最须要关注的局部莫过于通过测试供参考的源配置(列于文末)。TF应用 Google 的开源构建工具 bazel 构建,并且源码的版本与 bazel 的版本高度相干,所以尽量匹配版本进行构建。 流程记录 TF v1.14.0 CPU on Ubuntu 18.04装置对应版本的 bazel依据打算构建的版本,查阅文末的对应配置,参考官网文档: https://bazel.build/install/u... 装置相应版本的 bazel,如本次打算构建的版本是 v1.14.0,对应的 bazel 版本是 0.24.1(此次应用0.26.1也是能够的)。 为不便,这里间接贴出对应 0.26.1 release 的页面: https://github.com/bazelbuild... ,点击assets找到对应的文件下载即可。 wget https://github.com/bazelbuild/bazel/releases/download/0.26.1/bazel-0.26.1-installer-linux-x86_64.shchmod +x bazel-version-installer-linux-x86_64.sh./bazel-version-installer-linux-x86_64.sh --user克隆 TensorFlow 仓库从 Github 上 clone 源码仓库 git clone https://github.com/tensorflow/tensorflow cd 到仓库目录并 git checkout到相应 tag,比方这次是构建 v1.14.0 版本: git checkout v1.14.0* 一些小调整,通常能够略过Build with C++17因为之后须要写的 Custom OP 依赖的另一个库是 C++17,而除了刚刚才公布的 v2.10 版,以前的 TF默认是应用 C++11,理论构建的时候,代码有一些 minor fix。此处参考 https://github.com/tensorflow... 批改 .bazelrc 里 build:c++17 的配置,在 tensorflow/core/lib/gif/gif_io.cc 中增加 #include<cstring>, 并在 tensorflow/stream_executor/stream_executor_pimpl.h 中增加 #include "absl/memory/memory.h"(否则 compile 时会报错找不到 absl::make_unique)(这里 make_unique 是 C++17 规范库里的用法,Google的abseil的make_unique办法则不便C++11的代码也能够应用它;最新的v2.10版因为默认应用C++17,曾经改为std::make_unique) ...

January 3, 2023 · 4 min · jiezi

关于pip:MacBook安装pip和Django

MacBook装置pip和DjangoMacBook零碎自带了python #查看python版本python -V#显示如下:Python 2.7.16#装置pipsudo easy_install pip#查看pip版本pip --version#回显如下:pip 19.2.3 from /Library/Python/2.7/site-packages/pip-19.2.3-py2.7.egg/pip (python 2.7)#应用pip装置djangosudo pip install django#查看django版本python -m django --version#回显如下:1.11.24

October 8, 2022 · 1 min · jiezi

关于pip:升级pip并安装库

明天用pip装置一些罕用库,而后呈现以下这段代码。 须要降级一下pip WARNING: You are using pip version 20.3.1; however, version 21.3.1 is available.You should consider upgrading via the 'c:\program files\python\python.exe -m pip install --upgrade pip' command参考阿里巴巴开源镜像站 首先切换应用国内阿里巴巴的pypi镜像源 a. 找到下列文件(windows目录:C:\Users\Administrator) ~/.pip/pip.conf b. 在上述文件中增加或批改: [global]index-url = https://mirrors.aliyun.com/pypi/simple/[install]trusted-host=mirrors.aliyun.com接着降级pipcmd下输出:python -m pip install --upgrade pip ok 接着就能够持续应用pip install xxxxx 装置库了

February 15, 2022 · 1 min · jiezi

关于pip:centos7安装pip并配置国内阿里镜像源

参考阿里巴巴开源镜像站 centos7装置pip并配置国内阿里镜像源 首先装置pip前须要装置epel-release yum -y install epel-release 装置pip yum -y install python-pip 查看pip版本 pip --version 配置阿里镜像源(批改pip.conf) cd ~mkdir .pipcd .piptouch pip.confvi pip.conf批改为以下并保留 [global]index-url = https://mirrors.aliyun.com/pypi/simple/[install]trusted-host=mirrors.aliyun.com   实现

December 24, 2021 · 1 min · jiezi

关于pip:Ubuntu安装pip并切换国内源

参考阿里巴巴开源镜像站 Ubuntu装置pip并切换国内源 先装置Python 3和pip3 查看Python 3和pip3 python3 --version pip3 --version 装置实现后 创立pip文件夹 并创立pip.conf文件 cd ~mkdir .piptouch pip.confsudo chmod 755 pip.confgedit pip.conf输出阿里云pypi镜像源保留即可 [global]index-url = https://mirrors.aliyun.com/pypi/simple/[install]trusted-host=mirrors.aliyun.com              

December 24, 2021 · 1 min · jiezi

关于pip:windows系统下跟换pypi国内阿里镜像源pip

参考阿里巴巴开源镜像站 简介PyPI (Python Package Index) 是 Python 编程语言的软件存储库。开发者能够通过 PyPI 查找和装置由 Python 社区开发和共享的软件,也能够将本人开发的库上传至 PyPI 。 windows零碎下跟换pypi国内镜像源(pip) 首先在c盘的C:\Users\本人的用户名\  下找到pip文件夹如图 没有就新建一个 而后再点进去创立 pip.ini 编辑 [global]index-url = https://mirrors.aliyun.com/pypi/simple/[install]trusted-host=mirrors.aliyun.com 保留 终端运行pip install sklearn测试 实现

December 24, 2021 · 1 min · jiezi

关于pip:pip-install-远程主机强迫关闭了一个现有的连接-解决方案

在公司内网,通过代理拜访外网时,应用pip install会呈现如下问题: 果决应用pip install wheel -i http://pypi.douban.com/simple --trusted-host pypi.douban.com --user解决问题

August 3, 2021 · 1 min · jiezi

关于pip:pip-及-conda-常用指令

pip# 根本pip show numpypip listpip list --outdated# 装置与卸载 packagepip install numpy# 同时装置多个包pip install numpy scipy matplotlibpip uninstall numpypip install SomePackage-1.0-py2.py3-none-any.whl# 导入导出 requirementspip install -r requirements.txtpip freeze > requirements.txt# 清空缓存pip cache remove *conda# 在 PowerShell 中应用须要初始化以下指令conda init powershell# 列呈现有 conda 环境conda env list# 创立新的环境conda create -n new_env# 创立一个指定 Python 版本的新环境(会主动装置指定版本最新的稳固版本)conda create -n new_env python=3.x# 从已有环境拷贝并创立一个新的环境conda create -n new_env --clone source_env# 删除一个环境conda remove -n del_env --all# 更新以后环境的 Pythonconda install python=3.7# 更新以后环境的所有包conda update --all# 清理缓存conda clean --all

July 1, 2021 · 1 min · jiezi

关于pip:Python-包管理工具-poetryqbit

官网文档:https://python-poetry.org/docs/将虚拟目录放在我的项目内 poetry config virtualenvs.in-project true软件包国内镜像(pyproject.toml) [[tool.poetry.source]]name = "aliyun"url = "https://mirrors.aliyun.com/pypi/simple/"default = true本文出自 qbit snap

June 30, 2021 · 1 min · jiezi

关于pip:AttributeError-module-socks-has-no-attribute-create

问题bug当运行 pip install $PAK_NAME时,显示如下谬误: ERROR: Exception:Traceback (most recent call last): File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_internal/cli/base_command.py", line 188, in _main status = self.run(options, args) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_internal/cli/req_command.py", line 185, in wrapper return func(self, options, args) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_internal/commands/install.py", line 333, in run reqs, check_supported_wheels=not options.target_dir File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_internal/resolution/legacy/resolver.py", line 179, in resolve discovered_reqs.extend(self._resolve_one(requirement_set, req)) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_internal/resolution/legacy/resolver.py", line 362, in _resolve_one abstract_dist = self._get_abstract_dist_for(req_to_install) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_internal/resolution/legacy/resolver.py", line 313, in _get_abstract_dist_for self._populate_link(req) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_internal/resolution/legacy/resolver.py", line 279, in _populate_link req.link = self.finder.find_requirement(req, upgrade) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_internal/index/package_finder.py", line 901, in find_requirement req.name, specifier=req.specifier, hashes=hashes, File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_internal/index/package_finder.py", line 883, in find_best_candidate candidates = self.find_all_candidates(project_name) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_internal/index/package_finder.py", line 828, in find_all_candidates project_url, link_evaluator=link_evaluator, File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_internal/index/package_finder.py", line 792, in process_project_url html_page = self._link_collector.fetch_page(project_url) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_internal/index/collector.py", line 612, in fetch_page return _get_html_page(location, session=self.session) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_internal/index/collector.py", line 451, in _get_html_page resp = _get_html_response(url, session=session) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_internal/index/collector.py", line 166, in _get_html_response "Cache-Control": "max-age=0", File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py", line 543, in get return self.request('GET', url, **kwargs) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_internal/network/session.py", line 421, in request return super(PipSession, self).request(method, url, *args, **kwargs) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py", line 530, in request resp = self.send(prep, **send_kwargs) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py", line 643, in send r = adapter.send(request, **kwargs) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py", line 449, in send timeout=timeout File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py", line 672, in urlopen chunked=chunked, File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py", line 387, in _make_request conn.request(method, url, **httplib_request_kw) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/http/client.py", line 1252, in request self._send_request(method, url, body, headers, encode_chunked) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/http/client.py", line 1298, in _send_request self.endheaders(body, encode_chunked=encode_chunked) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/http/client.py", line 1247, in endheaders self._send_output(message_body, encode_chunked=encode_chunked) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/http/client.py", line 1026, in _send_output self.send(msg) File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/http/client.py", line 966, in send self.connect() File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py", line 184, in connect conn = self._new_conn() File "/home/$USER_NAME/anaconda3/envs/py37/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py", line 90, in _new_conn conn = socks.create_connection(AttributeError: module 'socks' has no attribute 'create_connection'解决方案狐疑是之前配置的全局代理的起因,查看~/.bashrc,在底部发现之前增加代码如下: ...

December 2, 2020 · 2 min · jiezi

关于pip:pip临时换源提升下载速度

用pip管理工具装置python第三方库时,默认应用国外的源文件,因而在国内的下载速度较慢。可通过长期更换国内镜像来晋升下载速度。 pip长期换源在应用pip时,通过增加参数-i来指定pip源。如: 装置第三方库: # 默认应用国外pip源pip install 库名 # 指定pip源,加上参数-i和镜像地址pip install 库名 -i http://mirrors.aliyun.com/pypi/simple/更新第三方库同理: # 默认应用国外pip源pip install --upgrade 库名# 指定pip源,加上参数-i和镜像地址pip install --upgrade 库名 -i http://mirrors.aliyun.com/pypi/simple/更换罕用的国内镜像阿里云:-i http://mirrors.aliyun.com/pypi/simple/ 清华大学:-i https://pypi.tuna.tsinghua.edu.cn/simple 中国科技大学 -i https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大学:-i http://pypi.hustunique.com/ 山东理工大学:-i http://pypi.sdutlinux.org/  豆瓣:-i http://pypi.douban.com/simple/

November 13, 2020 · 1 min · jiezi

pipenv 使用简介

之前在开发时一直使用 conda 使用作为虚拟环境管理工具,但有时候会经常会临时性的需要一个虚拟环境,如果使用 conda create 创建一个新环境,耗时不说,有时候还忘了删除,最后系统里一堆的虚拟环境。偶然发现 pipenv 后试用了一下,感觉它的工作流相比之前虚拟环境环境加 requirements.txt 的方式更加简单方便。安装pipenv 最好和 Python3 一起使用最简单的方式是通过 pip 安装pip3 install pipenv如果是 mac 用户也可以通过 Homebrew 安装brew install pipenv如果没有安装 pip 可以通过以下方式安装https://raw.githubusercontent.com/kennethreitz/pipenv/master/get-pipenv.py | python使用创建新项目mkdir myprojectpipenv install这会在 myproject 文件下创建 Pipfile 和 Pipfile.lock 文件,同时创建虚拟环境虚拟环境名称为 pipenv 加项目路径哈希值,如 pipenv-7BgKv-oXll-rw-r–r– 1 rookie rookie 138 4月 20 20:24 Pipfile-rw-r–r– 1 rookie rookie 453 4月 20 20:24 Pipfile.lock虚拟机环境默认位于 ~/.local/share/virtualenvs/,由于 pipenv 通过路径名哈希值与虚拟环境建立映射关系,因此如果移动项目会导致虚拟环境不可用。可以通过在 .bashrc 添加export PIPENV_VENV_IN_PROJECT=1 让 pipenv 在项目文件中创建虚拟环境,这时候虚拟环境位于 myproject/.venv 文件夹下。如果项删除虚拟环境,在项目顶层目录下运行pipenv –rm如果要指定 Python 版本,可以通过 –python 完成,如我要安装 python3.7 的虚拟环境pipenv –python 3.7配置文件# cat Pipfile[[source]]name = “pypi"url = “https://pypi.org/simple"verify_ssl = true[dev-packages][packages][requires]python_version = “3.6”[[source]] 模块指定了 pip 源位置,通常国内 pip 源加快下载速度[[source]]name = “tuna"url = “https://pypi.tuna.tsinghua.edu.cn/simple/"verify_ssl = true[[source]]name = “pypi"url = “https://pypi.org/simple"verify_ssl = true[dev-packages][packages][requires]python_version = “3.6"安装和卸载 packages你可以编辑 packages, 添加项目需要的 Python 库,如 requests=’**’,甚至可以指定不同平台下的包配置,详细配置参考 Advanced Usage of Pipenv不过你可以通过pipenv install requests来安装,pipenv 将会自动更新 Pipfile 和 Pipfile.lock。[dev-packages] 则是一些开发依赖但不是项目依赖包的存放目录,如 pylint 等 pep8 检查工具可以在安装时指定 pipenv install –dev将某个包声明为 dev-package卸载 package 也很简单pip uninstall如果通过 pipenv 命令安装和卸载 package,安装或卸载完成后还会更新 Pipfile.lock 文件,有时候会卡在这个步骤。通常可以 ctrl+c 强制推出,删除 Pipfile.lock, 然后pipenv lock重新生成该文件进入和退出虚拟环境进入虚拟环境cd myprojectpipenv shell退出虚拟环境pipenv exit高级用法有时候某些 package 需要指定特定的 pip 源,可以通过如下方式指定,非常简便[[source]]url = “https://pypi.python.org/simple"verify_ssl = truename = “pypi”[[source]]url = “http://pypi.home.kennethreitz.org/simple"verify_ssl = falsename = “home”[dev-packages][packages]requests = {version=””, index=“home”}maya = {version=””, index=“pypi”}records = “*“有时候需要生成 requirements.txt 文件pipenv lock -r如果只需要生成 dev-pakcages 列表,也很简单pipenv lock -r –dev自动载入环境变量文件。如果 .env 文件在项目根目录下,pipenv shell 和 pipenv run 将会自动载入文件中的环境变量。$ cat .envHELLO=WORLD$ pipenv run pythonLoading .env environment variables…Python 2.7.13 (default, Jul 18 2017, 09:17:00)[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwinType “help”, “copyright”, “credits” or “license” for more information.>>> import os>>> os.environ[‘HELLO’]‘WORLD’pipenv 还支持自定义命令,这对于某些开发过程中经常使用的命令来说非常方便。在 Pipfile 中添加 [scripts][scripts]printspam = “python -c "print(‘I am a silly example, no one would need to do this’)"“通过 pipenv run <custom_command> 即可运行自定义命令,如pipenv run echospam “indeed"I am really a very silly example indeed更多高级用户可以参考 官方文档最后欢迎关注我的 Blog-PrivateRookie ...

April 20, 2019 · 2 min · jiezi

使用 docker + devpi 搭建本地 pypi 源

前一段时间开发需要经常使用 pip 下载,虽然把 pip 源改成了国内源,但我对速度还是不满意,更为重要的是集成测试环境是离线的,要在集成测试环境开发显然需要搭建自己的本地 pip 源。在使用 devpi 之前我曾使用过 pip2pi,但有个 bug 导致离线环境下的 tox 命令总是失败,所以最后采用 devpi 搭建 pip 源。这里使用 docker 部署,方便又快速,如果不小心弄崩了也只需要重新运行 docker 容器就好了。如果你的环境没有安装 docker 可以自行搜素安装方法,比如 docker 社区的文档 install docker。如果你是 Centos 用户,可以使用以下方法安装sudo yum updatesudo yum -y install dockersudo systemctl enable dockersudo systemctl start docker接下来使用使用 docker 部署一个 Python 本地镜像源,我们可以使用 docker hub 上已有的镜像,我这里选择的是muccg/devpi 这个镜像# 设置 devpi 服务器管理员密码DEVPI_PASSWORD = 123mkdir -p /src/docker/devpimkdir /tmp/wheelhousedocker run -d –name devpi \ –publish 3141:3141 \ –volume /tmp/wheelhouse:/wheelhouse –volume /srv/docker/devpi:/data \ –env=DEVPI_PASSWORD=$DEVPI_PASSWORD \ –restart always \ muccg/docker-devpi接着先在本地下载好所需的wheel包,requirements.txt文件内容即为我们需要的 Python 库列表pip wheel –wheel-dir /tmp/wheelhouse -r requirements.txt如果从 pip 源下载的库已经是 wheel 包的话文件将会被直接放在 /tmp/wheelhouse 内,如果是tar 包,pip 会先 build 出 wheel 包,这可能需要一些时间。下载完成后 wheelhouse 内容类似于ll /tmp/wheelhousetotal 524K-rwxrwxrwx 1 rookie rookie 155K Apr 6 23:40 certifi-2019.3.9-py2.py3-none-any.whl-rwxrwxrwx 1 rookie rookie 131K Apr 6 23:40 chardet-3.0.4-py2.py3-none-any.whl-rwxrwxrwx 1 rookie rookie 58K Apr 6 23:40 idna-2.8-py2.py3-none-any.whl-rwxrwxrwx 1 rookie rookie 57K Apr 6 23:40 requests-2.21.0-py2.py3-none-any.whl-rwxrwxrwx 1 rookie rookie 116K Apr 6 23:40 urllib3-1.24.1-py2.py3-none-any.whl下载完成后如果本地环境安装了devpi客户端,可以直接上传 wheel 包,不过由于我们在创建容器时已经把 wheelhouse 文件夹挂载进去,也可以在在容器里直接操作# 进入容器docker exec -it -u root devpi bash# 登陆并上传devpi use http://<host_ip>:3141/root/public –set-cfgdevpi login root 123devpi upload –from-dir /wheelhouse上传完成后可以使用 http://<host_ip>:3141 查看 pip 本地源服务器状态。若要临时使用可以使用 pip install 的 –index 和 –trusted-host 选项pip install –index http://<host_ip>:3141/root/public/+simple/ \ –trusted-host <host_ip>或者修改 pip.conf 文件永久使用# vim ~/.pip/pip.conf[global]index_url = http://<host_ip>:3141/root/public/+simple/trusted-host = <host_ip>[search]index = http://<host_ip>:3141/root/public/最后,欢迎关注我的僵尸微信公众号 :) CodeWar ...

April 7, 2019 · 1 min · jiezi

开发函数计算的正确姿势 —— 安装第三方依赖

前言首先介绍下在本文出现的几个比较重要的概念:函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息参考。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档参考。fun install: fun install 是 fun 工具的一个子命令,用于安装 pip 和 apt 依赖,提供了命令行接口和 fun.yml 描述文件两种形式。备注: 本文介绍的技巧需要 Fun 版本大于等于 2.9.3。函数计算安装第三方依赖一大痛点,文章 函数计算安装依赖库方法小结 对可能会遇到的问题和解决方法做了细致总结,fun install 是基于之前的经验和成果将最佳实践的方法固化到工具中,方便用户便捷的安装依赖。初始化使用 fun install init 在当前目录初始化一个 fun.yml 文件。(这一步不是必须的,如果您打算手写 fun.yml 然后通过 fun install 命令批量执行 task,init 是一个好的开始。)在函数计算项目根目录执行 fun install init 命令,选择一个 runtime。$ fun install init? Select runtime (Use arrow keys) python2.7 python3 nodejs6 nodejs8 java8 php7.2然后会在当前目录生成一个 fun.yml 文件,内容如下:runtime: python2.7tasks: []安装 pip 包依赖下面的命令安装 python 的 tensorflow 包$ fun install –runtime python2.7 –package-type pip tensorflowskip pulling image aliyunfc/runtime-python2.7:build-1.2.0…Task => [UNNAMED] => PYTHONUSERBASE=/code/.fun/python pip install –user tensorflow说明–runtime 指定 runtime,如果已经初始化 fun.yml 文件, 由于 fun.yml 里声明了 runtime ,该选项可以省略。–package-type 指定安装依赖的类型,pip 和 apt 是目前的两个可选值。tensorflow 是一个 pip 包名。命令执行在 fc-docker 提供的 container 中,容器内部执行的命令会逐行打印出来,比如上面命令中内部真实执行了 PYTHONUSERBASE=/code/.fun/python pip install –user tensorflow 命令。安装完成以后会在生成一个 .fun 目录, 可执行文件会被放置到 .fun/python/bin 目录下,库文件放置到 .fun/python/lib/python2.7/site-packages 下。.fun└── python ├── bin │ ├── freeze_graph │ ├── markdown_py │ ├── pbr │ ├── saved_model_cli │ ├── tensorboard │ ├── tflite_convert │ ├── toco │ └── toco_from_protos └── lib └── python2.7 └── site-packages ├── tensorboard ├── tensorboard-1.12.2.dist-info ├── tensorflow ├── tensorflow-1.12.0.dist-info ├── termcolor-1.1.0.dist-info …相比之前的 pip install -t . <package-name> 方式,fun install 安装文件的存放位置更有组织,依赖文件和代码文件分离开了,便于清理、拆分后借助 OSS 或 NAS 初始化依赖文件。但是组织过后也带来一个新问题,需要用户自定义环境变量库文件才能被程序找到。为了方便用户使用提供了一个 fun install env 打印出必要的环境变量。$ fun install envLD_LIBRARY_PATH=/code/.fun/root/usr/lib/x86_64-linux-gnu:/code:/code/lib:/usr/local/libPATH=/code/.fun/root/usr/local/bin:/code/.fun/root/usr/local/sbin:/code/.fun/root/usr/bin:/code/.fun/root/usr/sbin:/code/.fun/root/sbin:/code/.fun/root/bin:/code/.fun/python/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/sbin:/binPYTHONUSERBASE=/code/.fun/python关于如果设定函数计算的环境变量,请参考 https://help.aliyun.com/document_detail/69777.html 。如果您使用 fun local 和 fun deploy 进行调试和部署,您无需关注环境变量问题,已经帮您设定好了。使用 –save 持久化install 命令加上 –save 参数,会将命令持久化成 task 保存到 fun.yml 文件中。$ fun install –runtime python2.7 –package-type pip –save tensorflowskip pulling image aliyunfc/runtime-python2.7:build-1.2.0…Task => [UNNAMED] => PYTHONUSERBASE=/code/.fun/python pip install –user tensorflow上面的命令多加了一行 –save 参数,查看 fun.yml 内容:runtime: python2.7tasks: - pip: tensorflow local: true之后直接执行 fun install 不带参数,就可以依次执行任务。$ fun installskip pulling image aliyunfc/runtime-python2.7:build-1.2.0…Task => [UNNAMED] => PYTHONUSERBASE=/code/.fun/python pip install –user tensorflow使用 -v 显示详细日志$ fun install -vskip pulling image aliyunfc/runtime-python3.6:build-1.2.0…Task => [UNNAMED] => apt-get update (if need)Ign http://mirrors.aliyun.com stretch InReleaseGet:1 http://mirrors.aliyun.com stretch-updates InRelease [91.0 kB]Get:2 http://mirrors.aliyun.com stretch-backports InRelease [91.8 kB]Get:3 http://mirrors.aliyun.com stretch/updates InRelease [94.3 kB]Hit http://mirrors.aliyun.com stretch Release.gpgHit http://mirrors.aliyun.com stretch ReleaseGet:4 http://mirrors.aliyun.com stretch-updates/main Sources [3911 B]….安装 apt 包依赖函数计算使用 apt-get 安装依赖是另一类常见的安装问题,使用 fun install 也可以方便的安装。$ fun install –runtime python3 –package-type apt libzbar0skip pulling image aliyunfc/runtime-python3.6:build-1.2.0…Task => [UNNAMED] => apt-get update (if need) => apt-get install -y -d -o=dir::cache=/code/.fun/tmp libzbar0 => bash -c ‘for f in $(ls /code/.fun/tmp/archives/.deb); do dpkg -x $f /code/.fun/root; done;’ => bash -c ‘rm -rf /code/.fun/tmp/archives’使用方法及其参数和 pip 包依赖类似,只需要将 –package-type 设定成 apt, 包名使用日常 apt-get 可以安装的 deb 包名即可。使用 fun.ymlfun.yml 由一组 task 组成,执行 fun install 命令时会依次执行 task ,达到批量安装的效果。fun.yml 的文件格式如下runtime: python3tasks: - name: install libzbar0 apt: libzbar0 local: true - name install Pillow by pip pip: Pillow local: true - name: just test shell task shell: echo ‘111’ > 1.txtruntime 是必填的字段。目前 task 有三种类型:apt, pip 和 shell。fun.yml 文件放置在 template.yml 文件中函数 codeUri 指向的目录,如果 template.yml 里声明了多个函数,并且放置在不同的 codeUri 目录,需要创建多个 fun.yml 文件。所有 task 的 name 字段是可选的,没有 name 字段的时候执行的时候会输出为Task => [UNNAMED]apt/pip taskapt 和 pip 类型的 task 都是 install task 的子类型,描述格式类似name: install libzbar0apt: libzbar0local: true上面的 task 描述与下面的命令是等价的fun install –package-type apt libzbar0在使用 fun install 安装的过程中,使用 –save 参数可以在当前目录的 fun.yml 文件中生成上面 task 的描述结构。local 字段默认为 true,表示依赖会被装在当前目录的 .fun 子目录下,打包 zip 的时候回一并打包进去。设定为 false,依赖安装到系统目录,这种情况一般用于编译依赖,比如某个执行文件或者库是编译或者构建期需要的,运行期不要,那可以设定 local: false,打包的时候会被忽略,不影响最终 zip 包的文件尺寸。shell taskshell 类型的 task 是为基于源码编码的安装场景设计的。name: install from sourceshell: ./autogen.sh –disable-report-builder –disable-lpsolve –disable-coinmp示例下面是一个 python3 实现简单二维码识别程序部署到函数计算的例子。源码位于 https://github.com/aliyun/fun/tree/master/examples/install/pyzbar_example本例子使用 pip 的 pyzbar 库进行二维码识别,pyzbar 依赖 apt-get 安装的 libzbar0 库。装载图片需要 pip 的 Pillow 库。所以 fun.yml 的文件描述如下runtime: python3tasks: - apt: libzbar0 local: true - pip: Pillow local: true - pip: pyzbar local: true使用 fun install 安装依赖$ fun installskip pulling image aliyunfc/runtime-python3.6:build-1.2.0…Task => [UNNAMED] => apt-get update (if need) => apt-get install -y -d -o=dir::cache=/code/.fun/tmp libzbar0 => bash -c ‘for f in $(ls /code/.fun/tmp/archives/.deb); do dpkg -x $f /code/.fun/root; done;’ => bash -c ‘rm -rf /code/.fun/tmp/archives’Task => [UNNAMED] => PYTHONUSERBASE=/code/.fun/python pip install –user PillowTask => [UNNAMED] => PYTHONUSERBASE=/code/.fun/python pip install –user pyzbartemplate.yml 文件内容如下ROSTemplateFormatVersion: ‘2015-09-01’Transform: ‘Aliyun::Serverless-2018-04-03’Resources: pyzbar-srv: Type: ‘Aliyun::Serverless::Service’ pyzbar-fun: Type: ‘Aliyun::Serverless::Function’ Properties: Handler: index.handler Runtime: python3 Timeout: 60 MemorySize: 128 CodeUri: .index.py 文件内容如下:from pyzbar.pyzbar import decodefrom pyzbar.pyzbar import ZBarSymbolfrom PIL import Imagedef handler(event, context): img = Image.open(’./qrcode.png’) return decode(img, symbols=[ZBarSymbol.QRCODE])[0].data使用 fun local 在本地执行fun local invoke pyzbar-funskip pulling image aliyunfc/runtime-python3.6:1.2.0…ThalassiodraconRequestId: 964980d1-1f1b-4f91-bfd8-eadd26a307b3 Billed Duration: 630 ms Memory Size: 1998 MB Max Memory Used: 32 MBThalassiodracon 即为识别后的输出结果。小结本文介绍了 fun 工具的一个新特性 fun install ,使用 fun install 可以方便的安装 apt 和 pip 软件包,对于多次安装的工程化需求可以考虑将安装步骤持久化为 fun.yml 文件. fun.yml 文件提供了比命令行更多的功能,可以编写 shell 类型的 task,以支持源码安装的场景。可以通过设定 local: false 将依赖安装的系统目录,以解决编译依赖而非运行依赖的情况。本文作者:倚贤阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

January 25, 2019 · 4 min · jiezi

从javascript到python(一):基本环境搭建

写在前面本系列文章针对前端开发人员快速地通过javascript相关概念来理解学习python,如果你对javascript本身都不熟悉,可能这些文章就并不适合你。这些文章主要用语本实验室的前端同学学习之用,描述可能有点累赘,还请读者理解。环境搭建安装VSCode安装Python 3.7安装VSCode插件python库的安装说明:本文中的演示均是在mac os环境下做的配置安装Python 3.7特别建议从官网安装,尽量不要通过百度乱搜一气,浪费时间。当然官网通常都是英文,很多同学没有勇气去看,但是我相信只要进入大学的同学都应该认识DownLoad这个单词。很多软件安装完成之后是没有UI界面的,我们要学会使用命令行在安装完成之后测试安装是否成功。python3 –version如果可以看到指令执行完成后输出了上面的页面数据就表示安装成功。无UI软件的安装总结安装来源尽量选择官网安装尽量选择稳定版,测试版是什么意思应该都懂,初学者就应该有初学者的觉悟!安装完成之后通常都可以在命令行中测试安装是否成功。安装都不成功,后续操作出的问题就很麻烦如果你真的是个新手,建议在虚拟机中安装软件,在安装之前先做一个虚拟机镜像,出了问题随时回滚镜像安装VSCode插件笔者就装了这一个,剩下的插件VSCode自动会提示你安装Python库的安装Python的强大之处在于它有很多实用库,安装好了之后就可以实用,其安装工具为pip,或者pip。如何理解pip和pip3?pip、pip3 类似于Node.js下的npm如果你装的是Python2 那么会自动安装上pip,如果你装的是python3,同理会装上 pip3既然类似于npm,那么必然存在库的源的问题,npm中是用cnpm设定淘宝源来解决的,pip 可以设定国内的源。一般情况下都推荐清华的源,设定方式在链接文档中有说明,我就不赘述了pip会把库安装到python2.7/site-packages,pip3 会把库安装到python3.6/site-packagespip指令的参数可以使用如下的方式来查询pip –help经常用到的是sudo pip install flask \安装flask的包,为什么要加上sudo,还请思考下pip list \显示使用pip指令已经安装的库的列表pip show \显示安装库的详细信息pip3的指令和上面几乎一样,笔者就不赘述了。希望同学们学会使用指令调取帮助文件和参看版本pip –helppip -V

December 19, 2018 · 1 min · jiezi

使用 sed 一键修改 python 的 pip/pypi 源

Python 默认的 pip 源是[global]index-url = https://pypi.python.org/simple/国内访问速度比较慢,可以通过修改 ~/.pip/pip.conf 配置来指定国内的 pip 源。我一般使用清华的 pip 源,速度很快。安装完 Python 之后可以很方便地使用 sed 一键修改 pip 源sed ’s/http.*/https://pypi.tuna.tsinghua.edu.cn/simple/’ ~/.pip/pip.conf

December 3, 2018 · 1 min · jiezi

Python的依赖包之pip管理工具的基础使用

pip是什么我们都知道Python很强大,实用性也非常高,其很重要的一个原因就是因为有非常丰富的第三方库类,而pip是Python的的依赖包管理工具,该工具提供了对Python包的查找、下载、安装、卸载等的功能。基本使用到的包都可以在https://pypi.org/上面搜索找到。当然了,官网的包可能涉及翻墙访问的问题,也可以使用国内的镜像,例如豆瓣的镜像http://pypi.douban.com/simple/、清华的镜像https://pypi.tuna.tsinghua.edu.cn/simple等……安装pip具体的安装方法可以查看官网的安装说明官方安装说明地址:https://pip.pypa.io/en/latest/installing/#id7Windows的用户,需要先到官网下载get-pip.py安装包,然后执行python get-pip.py进行安装而如果需要在Linux上安装的话,则比较方便和快捷的,直接可以通过yum或者apt-get安装即可yum安装sudo yum install python-pipapt-get安装sudo apt-get install python-pip更多安装方法请安装文档:https://packaging.python.org/guides/installing-using-linux-tools/#installing-pip-setuptools-wheel-with-linux-package-managers查看pip版本简写方式pip -V完整命令方式pip –version利用pip安装模块pip install [module_name]查看所有已安装的模块pip list如果需要搜索指定的模块的话,可以使用下面的命令pip search [module_name]还可以使用下面的方法(PS:好像不是全起作用)pip list | grep [module_name]查看已安装的某个模块的详细信息pip show –files [module_name]检查哪些模块需要更新pip list –outdated升级指定的模块 pip install –U [module_name]卸载已经安装的模块pip uninstall [module_name]需要查看更多pip的用法pip –help更新pip本身Windows的用户执行下面的命令python -m pip install -U pipLinux或者Mac OS的用户执行下面的命令pip install -U pip

October 26, 2018 · 1 min · jiezi

Python打包系统简单入门

最近把pyenv、pipenv这种都研究了一下,然后我发现一个严重的问题:就是我虽然看了半天这些工具,但是我对Python自己的打包系统却完全没有了解。所以这篇文章就来研究一下Python自带的打包系统。pip先来详细介绍一下pip的用法,平时基本上我们用pip的时候也就是一个pip install。其实pip也有很多特性,在此先介绍一下常用的一些特性。此部分参考了pip文档,想了解更多的话可以看原文。安装最常用的命令就是安装了,除此以外还可以指定版本号:$ pip install SomePackage # 不指定版本号,安装最新版$ pip install SomePackage==1.0.4 # 指定版本号$ pip install ‘SomePackage>=1.0.4’ # 指定最小版本号$ pip install -r requirements.txt # 从需求文件安装$ pip install -e . # 从本地项目setup.py安装使用代理服务器当从官方的PyPI源安装比较慢的时候,可以考虑使用代理服务器,指定代理服务器的方法有三种:使用–proxy参数在命令行指定,代理格式为[user:passwd@]proxy.server:port。在配置文件中指定。设置http_proxy, https_proxy 和no_proxy环境变量。使用需求文件(requirements.txt)在需要很多pip包的项目中,用pip一个个安装包不是一个好办法,这时候可以考虑使用需求文件。如果要生成需求文件,用下面的命令。这会将当前Python环境中的所有包的当前版本状态保存下来,将来安装的时候会精确还原到冻结的那个状态。pip freeze > requirements.txt要从需求文件中安装,则是用下面的命令:pip install -r requirements.txt官方文档还给出了一个带注释的实例需求文件:######## example-requirements.txt ############## 没有版本标识符的包,会安装最新版 ######nosenose-covbeautifulsoup4####### 带版本标识符的包 ####### 版本标识符的资料 https://www.python.org/dev/peps/pep-0440/#version-specifiersdocopt == 0.6.1 # Version Matching. Must be version 0.6.1keyring >= 4.1.1 # Minimum version 4.1.1coverage != 3.5 # Version Exclusion. Anything except version 3.5Mopidy-Dirble = 1.1 # Compatible release. Same as >= 1.1, == 1.*####### 还可以指定其他的需求文件 ######-r other-requirements.txt######## 还可以指定本地货网络上的特定包 ######./downloads/numpy-1.9.2-cp34-none-win32.whlhttp://wxpython.org/Phoenix/snapshot-builds/wxPython_Phoenix-3.0.3.dev1820+49a8884-cp34-none-win_amd64.whl####### Additional Requirements without Version Specifiers ####### 和第一部分一样,这里这些部分没有顺序需求,可以随意改变位置rejectedgreen#版本标识符用来指定包的版本,有以下几个例子:SomeProjectSomeProject == 1.3SomeProject >=1.2,<.2.0SomeProject[foo, bar]SomeProject=1.4.2从6.0版本开始,pip也支持环境标记(也就是分号后面跟Python版本或者系统类型):SomeProject ==5.4 ; python_version < ‘2.7’SomeProject; sys_platform == ‘win32’卸载卸载某个包使用下面的命令:$ pip uninstall SomePackage列出包要列出所有已安装的包:$ pip listdocutils (0.9.1)Jinja2 (2.6)Pygments (1.5)Sphinx (1.1.2)要列出过时的包:$ pip list –outdateddocutils (Current: 0.9.1 Latest: 0.10)Sphinx (Current: 1.1.2 Latest: 1.1.3)要列出某个已安装的包的详细信息:$ pip show sphinx—Name: SphinxVersion: 1.1.3Location: /my/env/lib/pythonx.x/site-packagesRequires: Pygments, Jinja2, docutils搜索要搜索一个包,用下面的命令,搜索结果可能有很多:$ pip search “query"更新要更新一个包,使用-U或者–upgrade参数:pip install -U <pkg>如果想更新所有的包,很遗憾,pip并没有提供该功能,我在StackOverFlow上找到一个看起来比较简单的解决办法,就是在Python解释器中执行下面的代码:import pkg_resourcesfrom subprocess import callpackages = [dist.project_name for dist in pkg_resources.working_set]call(“pip install –upgrade " + ’ ‘.join(packages), shell=True)以上就是pip的一些简单用法,详情可参考官方文档。打包项目下面就进入本文的正题,Python的打包系统上。基本上我们不需要完全了解打包系统,只要学会简单的几个点就可以打包自己的类库了。打包需要distutils、setuptools、wheel等类库,不过基本上我们只需要写好其中最重要的setup.py,就可以完成打包工作了。distutils是官方的类库,在当年有很广泛的使用,不过到了现在很难用。distutuils类库的核心就是setup函数,我们需要将项目的各种信息作为参数传递给setup函数,然后就可以用相关命令创建项目分发包了。关于distutils的用法,可以参考官方文档。当然现在项目基本都不用distutils了,有更好用的第三方替代品,那就是setuptools,它可以算作是distutils的加强版,功能更加强大、使用更加简单,这就是这里要介绍的。其实从文档就可以看出来,distutils毕竟时间比较早,有些接口设计的不太合理甚至有些反人类,setuptools的文档就简单多了。准备项目为了做演示,首先需要准备一个项目,一个项目应该包括README和LICENSE等文件,README文件是Markdown格式的文本文件,用于描述项目自身;LICENSE文件是授权文件,列出项目使用者应该遵循的各种条款。下图是我的项目结构。此外还可能存在几个文件:setup.cfg。对应的配置文件,一般情况下可以不要。MANIFEST.in。清单文件,当项目中需要一些没办法自动包括到源代码分发包的文件时,可能需要用到它。具体文件内容就不列出了。需要注意my_package/init.py文件中应该有如下一行标识包名:name = ‘yitian_first_package’编写setup.py文件用setuptools来编写setup.py文件是一件非常简单的事情,而且有很多例子可供参考,我挑选了Kenneth Reitz(requests、pipenv等类库的作者)写的例子,做了一些修改并翻译了一些注释:#!/usr/bin/env python# -- coding: utf-8 --# 注意 如果要使用上传功能,需要安装twine包:# $ pip install twineimport ioimport osimport sysfrom shutil import rmtreefrom setuptools import find_packages, setup, Command# 包的元信息NAME = ‘yitian_first_package’DESCRIPTION = ‘项目的简短描述,不超过200字符’URL = ‘https://github.com/techstay/python-study'EMAIL = ’lovery521@gmail.com’AUTHOR = ‘易天’REQUIRES_PYTHON = ‘>=3.6.0’VERSION = ‘0.1.0’KEYWORDS = ‘sample setuptools development’# 项目依赖,也就是必须安装的包REQUIRED = [ ‘requests-html’]# 项目的可选依赖,可以不用安装EXTRAS = { # ‘fancy feature’: [‘django’],}# 剩下部分不用怎么管 :)# ————————————————# 除了授权和授权文件标识符!# 如果你改了License, 记得也相应修改Trove Classifier!here = os.path.abspath(os.path.dirname(file))# 导入README文件作为项目长描述.# 注意 这需要README文件存在!try: with io.open(os.path.join(here, ‘README.md’), encoding=‘utf-8’) as f: long_description = ‘\n’ + f.read()except FileNotFoundError: long_description = DESCRIPTION# 当前面没指定版本号的时候,将包的 version.py 模块加载进来about = {}if not VERSION: with open(os.path.join(here, NAME, ‘version.py’)) as f: exec(f.read(), about)else: about[’version’] = VERSIONclass UploadCommand(Command): “““上传功能支持””” description = ‘Build and publish the package.’ user_options = [] @staticmethod def status(s): “““Prints things in bold.””” print(’\033[1m{0}\033[0m’.format(s)) def initialize_options(self): pass def finalize_options(self): pass def run(self): try: self.status(‘Removing previous builds…’) rmtree(os.path.join(here, ‘dist’)) except OSError: pass self.status(‘Building Source and Wheel (universal) distribution…’) os.system(’{0} setup.py sdist bdist_wheel –universal’.format(sys.executable)) self.status(‘Uploading the package to PyPI via Twine…’) os.system(’twine upload dist/’) self.status(‘Pushing git tags…’) os.system(‘git tag v{0}’.format(about[’version’])) os.system(‘git push –tags’) sys.exit()# 神奇的操作,一个函数完事setup( name=NAME, version=about[’version’], description=DESCRIPTION, long_description=long_description, long_description_content_type=‘text/markdown’, author=AUTHOR, author_email=EMAIL, python_requires=REQUIRES_PYTHON, url=URL, keywords=KEYWORDS, # 项目中要包括和要排除的文件,setuptools可以自动搜索__init__.py文件来找到包 packages=find_packages(exclude=(’tests’,)), # 如果项目中包含任何不在包中的单文件模块,需要添加py_modules让setuptools能找到它们: # py_modules=[‘yitian_first_package’], # entry_points={ # ‘console_scripts’: [‘mycli=mymodule:cli’], # }, install_requires=REQUIRED, extras_require=EXTRAS, # 老旧的distutils需要手动添加项目中需要的非代码文件,setuptools可以用下面参数自动添加(仅限包目录下) include_package_data=True, # 如果是包的子目录下,则需要手动添加 package_data={ ‘yitian_first_package’: [‘static/.html’] }, license=‘MIT’, classifiers=[ # Trove classifiers # Full list: https://pypi.python.org/pypi?%3Aaction=list_classifiers ‘License :: OSI Approved :: MIT License’, ‘Programming Language :: Python’, ‘Programming Language :: Python :: 3’, ‘Programming Language :: Python :: 3.7’, ‘Programming Language :: Python :: Implementation :: CPython’, ‘Programming Language :: Python :: Implementation :: PyPy’ ], # $ setup.py publish support. cmdclass={ ‘upload’: UploadCommand, },)下面再讲一些在注释里没法详细解释的东西,官方文档的内容更丰富,有需要的可以查看。示例文件中其实还有几个setup参数没写全,这里再补充一下。project_urlsproject_urls参数可以列出一些相关项目的URL。project_urls={ ‘Documentation’: ‘https://packaging.python.org/tutorials/distributing-packages/’, ‘Funding’: ‘https://donate.pypi.org’, ‘Say Thanks!’: ‘http://saythanks.io/to/example’, ‘Source’: ‘https://github.com/pypa/sampleproject/’, ‘Tracker’: ‘https://github.com/pypa/sampleproject/issues’,},python_requires参数格式就是pip中指定包版本的标识符,,指定我们项目支持的Python版本,这里再补充几个例子。# 大版本号大于等于3python_requires=’>=3’,# 版本号大于等于3.3,但是不能超过4python_requires=’~=3.3’,# 支持2.6 2.7以及所有以3.3开头的Python 3版本python_requires=’>=2.6, !=3.0., !=3.1., !=3.2.*, <4’,package_data和data_filepackage_data和data_file参数用于指定数据文件,也就是在项目中使用到的非代码文件,一般情况下通过设置include_package_data=True自动搜索就够用了,如果需要细粒度的控制,就要使用它们了,详情见setuptools 文档 - Including Data Files。package_data指定包括在包中的数据文件,也就是“包数据文件”,这些文件会复制到包的相应目录。package_data={ ‘package_name’: [‘package_data.dat’],},data_files指定放在包外的数据文件,这些文件会被复制到项目根目录下指定的相对目录中。data_files=[(‘my_data’, [‘data/data_file’])],entry_pointsentry_points参数指定一些入口点,可以看做是项目提供的一些额外功能,其中最常见的就是console_scripts,用于注册脚本接口。setuptools提供的工具链可以在安装项目分发包的时候将这些接口转化为真正的可执行脚本,更多信息参考setuptools文档 - Automatic Script Creation。entry_points={ ‘console_scripts’: [ ‘sample=sample:main’, ],},版本号下面是开发、A测、B测、发布候选、最终发布等情况的版本号实例。1.2.0.dev1 # Development release1.2.0a1 # Alpha Release1.2.0b1 # Beta Release1.2.0rc1 # Release Candidate1.2.0 # Final Release1.2.0.post1 # Post Release15.10 # Date based release23 # Serial release开发模式setup.py文件写完之后,项目就算是可打包状态了。当然也可以继续在项目上进行工作,这时候一般希望项目既可以作为包来安装,又希望项目是可以编辑的,这时候就可以进入开发模式。这种情况下需要用下面的命令来安装包,-e选项全称是–editable,也就是可编辑的意思;.表示当前目录,也就是setup.py存在的那个目录:pip install -e .该命令会安装install_requires中指定的所有包,以及console_scripts部分指定的脚本。依赖项会作为普通包来安装,而项目本身会以可编辑状态来安装。特别的,如果只希望安装项目本身而不安装所有依赖包,用下面的命令:pip install -e . –no-deps如果有需要的话,还可以安装VCS或者本地目录中保存的包来替代官方索引中的包。详情请查看文档。打包项目终于到了观看成果的时候了,项目可以被打包成各种类型的可分发包,这里只介绍几种最常用的。源码分发包(sdist)这是最低等级的一种,基本上就是复制源代码,不过因此在安装的时候有一个必须的构建(可能包括编译)过程来生成各种元信息,哪怕项目是纯的Python项目。用下面的命令来生成:python setup.py sdistWheels(轮子)在编程界各种第三方包不是被形象地称作轮子吗(著名梗:不要重复造轮子),这里就是这个意思。轮子是一种二进制分发包,是现在最推荐的分发包格式,轮子又可以分为好几种轮子。当然,在构建轮子之前,还需要安装wheel包来提供支持。pip install wheel通用轮子。也就是项目中只存在Python代码,同时兼容Python 2和Python 3的轮子,用下面的命令生成。python setup.py bdist_wheel –universal当然也可以在setup.cfg配置文件中指定:[bdist_wheel]universal=1纯Python轮子。和通用轮子差不多,不过只支持Python 2或者Python 3.python setup.py bdist_wheel平台轮子。这种轮子中不仅有Python代码,一般还包括但不限于C代码写成的扩展等,因此它们只支持特定平台。python setup.py bdist_wheel运行以上命令之后,会在dist文件夹中生成打包好的可发布包。发布项目项目打包完毕,生成可可分发包之后,最后一步就是发布项目了。几乎所有的项目都被发布到了Python Package Index(简称PyPI)上了,当然如果有需求的话还可以搭建自己的私人索引,不过这就是另一个话题了。很有意思的是,Python官方还提供了一个测试索引,它是一个和PyPI完全一样的测试网站,定期清理,可以让我们方便的练习上传项目,同时不用担心会污染官方仓库。使用方法很简单,先注册一个账户。上传项目需要用到另一个类库twine:pip install twine然后用下面的命令将包上传到测试索引中,该命令会提示输入刚才注册用的用户名和密码:twine upload –repository-url https://test.pypi.org/legacy/ dist/*稍等片刻,上传应该就完成了。然后就可以在测试索引中找到我的项目了。当然由于测试索引会定期清理的缘故,可能过段时间项目和我的账户就都不存在了。全部流程都熟悉之后,就可以在官方索引上注册账号,并将项目上传上去,这样一来,全世界的开发者都能用到你的项目了! ...

October 5, 2018 · 3 min · jiezi