博文

Linux上的后台进程管理工具Supervisor

Supervisor简介、安装、配置

Ubuntu 16.04升级Python3.5到Python3.6后带来的问题

背景介绍: Ubuntu16.04默认的Python版本是2.7(python)和3.5(python3),而我更喜欢用Python3.6,而且anaconda目前默认支持的也是3.6,所以就网上找了一个升级的方法升把Python升级到了3.6.而且设置了python3的默认为python3.6 升级3.6: https://blog.csdn.net/lzzyok/article/details/77413968 并且使用了 update-alternatives 来配置具体使用哪个python3版本 然后安装anaconda: anaconda的安装比较简单,就是在官网上下载anaconda3版本对应的sh文件,然后安装。最后将环境变量写入.bashrc中(zsh需要写入.zshrc文件中)。至此因为环境变量的改变,导致目前默认python已经变成了anaconda的Python3.6 问题Ubuntu自带的终端打不开 重启电脑后terminal打不开,在search打开XTerm后,输入 gnome-terminal 发现有“ ImportError: cannot import name '_gi' ”问题。网上找了下原因,其实拷贝之前的35版本的文件为36版本的即可。 https://blog.csdn.net/jaket5219999/article/details/78465251 indicator-sysmonitor打不开 这个软件是在任务栏中监视cpu/内存/网速等的工具。 因为也是无法使用,所以在终端中输入indicator-sysmonitor命令后看了下错误提示: ImportError: cannot import name '_psutil_linux' 其实这个问题和上面那个问题很类似。 先用find搜索了下: sudo find /usr/lib/python3 -name '_psutil*' /usr/lib/python3/dist-packages/psutil/_psutil_posix.cpython-35m-x86_64-linux-gnu.so /usr/lib/python3/dist-packa...

Ubuntu 16.04安装Python3.6

参考: https://blog.csdn.net/lzzyok/article/details/77413968 中间还可以看下pip -V和pip3 -V来确认下pip的版本信息 最后不要忘了使用 update-alternatives来切换Python的版本,这样的好处是pip3也跟着换成Python3.6的了 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3. 5 1 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3. 6 2 sudo update-alternatives --config python3

tree命令获得文档结构

$ sudo apt-get install tree $ tree 得到当前目录下的文档结构 或者 $ tree 目录名 得到目录名下的文档结构 或者 $ tree -I ' node_modules|dist|*.mp3|*.jpg ' -f -I表示后面匹配上的内容不显示,-f表示每行显示完整的路径名 参考 生成项目结构图 - Tree命令的使用

获得pip中各个包的依赖关系

安装 $ pip install pipdeptree 运行得到结果 $ pipdeptree adium-theme-ubuntu==0.3.4 decorator==4.0.6 ipython==2.4.1 meld==3.14.2 pexpect==4.0.1 pipdeptree==0.12.1   - pip [required: >=6.0.0, installed: 10.0.1] ptyprocess==0.5 pycurl==7.43.0 pygobject==3.20.0 pylint==1.8.4   - astroid [required: >=1.6,<2.0, installed: 1.6.3]     - backports.functools-lru-cache [required: Any, installed: 1.5]     - enum34 [required: >=1.1.3, installed: 1.1.6]     - lazy-object-proxy [required: Any, installed: 1.3.1]     - singledispatch [required: Any, installed: 3.4.0.3]       - six [required: Any, installed: 1.11.0]     - six [required: Any, installed: 1.11.0]     - wrapt [required: Any, installed: 1.10.11]   - backports.functools-lru-cache [required: Any, installed: 1.5]   - configparser [required: Any, installed: 3.5.0]   - isort [required: >=4.2...

Bazel的扩展

Bazel的扩展代码都是写在.bzl文件中,然后通过load()函数在WORKSPACE文件或者BUILD文件中调用。比如: load ( "//build_tools/rules:maprule.bzl" , "maprule" ) 可以加载的扩展有:rule、函数、常量。在.bzl文件中 _ 开头的符号是私有的,不能被别的文件load。目前所有的.bzl文件都是可见的,不需要额外的export_files操作。 .bzl文件都是由Skylark语言所写的,这是一个类Python的语言,不过有些地方与python稍有不同。我们无需研究特别深入,不过这个文档 Skylark简介 推荐看下。 Macro和Rule 这是bazel的扩展中非常重要的两个概念,这里会做个大体的介绍,下面有细节介绍。 一个 macro 是指一个rule的实例化,也就是说在macro中会调用一些rule来做事情。当一个BUILD文件里面很多内容具有重复性和复杂性的时候,就可以使用macro来做代码的重复使用的简化。 rule 比macro要强大的多,它可以深入到bazel的内部并且完全控制正在发生的事情。比如可以传递信息到其他的rule中。 总的来说:如果你想重复使用简单的逻辑,那么就使用macro。如果macro变得非常复杂,那么就推荐将其变成一个rule。比如对一个新的编程语言的支持,就是通过rule来实现的。不过rule只是给高级用户使用的,期待绝大多数的用户永远不会需要写一个rule,而只是load和call已经存在的rule就够了。 Macro细节 创建macro macro没有别的功能,只是用来做封装和方便代码重用。正如其名,这其实是个宏,只在bazel的load阶段完成之前存在,load完成之后macro就不村子了,bazel只会看到这些宏所创建的rules。 native rules(也就是不需要load()语句加载的rules)可以通过 native   模块来调用,比如: def my_macro ( name , visibility = None ): native . cc_library ( name = name , srcs...

Bazel生成Python的部署文件

https://groups.google.com/forum/#!topic/bazel-discuss/42QRn8qU0eo 我们已经知道,对于:  Java/Scala/Groovy 在Bazel中可以使用target_name_deploy.jar来生成部署文件 C++/D/Rust/Go 在Bazel中可以生成静态的二进制文件 Python 那么对于Python语言,bazel可以使用下面这个工程来支持生成par文件(see github.com/google/subpar ) Subpar 这个是用来在Bazel中协助生成python可执行文件的一个项目。不过并不是Google的一个官方产品。 由于这个项目也是由Bazel来维护的,所以可以直接使用git_repository()来添加到本地WORKSPACE中索引使用: git_repository( name = " subpar " , remote = " https://github.com/google/subpar " , tag = " 1.0.0 " , ) 然后可以在BUILD文件中添加load()以及调用par_binary()来完成target的定义: load( " @subpar//:subpar.bzl " , " par_binary " ) par_binary( name = ' foo ' , srcs = [ ' foo.py ' , ' bar.py ' ], deps = [ ' //baz:some_py_lib ' ], data = [ ' quux.dat ' ], ) 不过如果在已有的BUILD中已有,py_binary()而且不想注释掉的话。需要做如下修改: py_binary( name = ' foo ' , # 已有py_binary()的定义和命名 src...