cygwin下python环境一些包的踩坑记录

坚持使用cygwin下的python,只有一个原因,要使用cygwin环境下unix/gnu-linux工具;但,毕竟cygwin不是真正的unix/linux,有一些问题貌似无法解决的,钻牛角尖折腾半天,结果还是失败,所以有必要做个踩坑记录,或者也可以说是踩雷记录。

貌似无解的一些包

psutil

[psutil (process and system utilities) is a cross-platform library for retrieving information on running processes and system utilization (CPU, memory, ...] 不支持信息参看,其github上的讨论贴 https://github.com/giampaolo/psutil/issues/82

依赖它的一些包,就不要指望安装了,即使装上运行,结果也有可能异常,如 scipy, matplotlib, scipy, scikit-learn,

不过,因为cygwin本身包含了matplotlib 包,可以使用它安装,如果是venv环境,把安装后的文件从 site-packages 里拷到venv下使用,经验上应该没有什么问题。如果运行中提示缺少依赖包(至少包括 mpl_toolkits)也要同步拷过来 。

 

cygwin:生存指南(简介,安装,使用,技巧)

前言

cygwin是让windows获得unix/linux部分功能的一个神器,本文是个人的一些经验,推荐初学者参考。有一经验的读者也可参阅斧正。

cygwin是什么?

cygwin是运行在windows下的GNU/linux环境,包含了几乎所有的常用Linux软件,使用上跟linux高度一致。由RedHat主导开发。cygwin官网

cygwin安装

到cygwin官网上下载安装程序: setup-x86.exe (32-bit ) or setup-x86_64.exe (64-bit )。双击运行,有安装向导,照做即行。

其中有两个路径一个url,有必要关注一下:

Root Directory, cygwin将安装到这个目录,推荐装到 D:\cygwin  (原因:重装windows通常不影响D盘;目录层级浅,找起来方便)

Local Package Directory, 安装向导下载的安装包存储路径,放到 F:\cygwin_download  或你希望的目录,cygwin安装后其中的文件就可以删除了,不过如果硬盘有空间,留着也不多,毕竟下次添加/更新安装包时,有可能还用得着。另外安装程序 setup-x86.exe 或 setup-x86_64.exe 也推荐放到这个目录里,cygwin里添加/删除包时还要用它(它相当于yum/apt-get,不过是gui版的,不是cli)

Choose A Download Site, 为了更快的下载安装包,推荐选择国内的镜像站点,自行添加镜像url也是可以的,比如下面这几个:

  • http://mirrors.neusoft.edu.cn/
  • http://mirrors.ustc.edu.cn/
  • http://mirrors.aliyun.com/
  • http://mirrors.163.com/

安装后,默认会在桌面放一个图标,可以将该快捷方式复制到你习惯的地方,比如快速启动栏。

默认情况下,cygwin只安装要最小化的环境,需要装哪些软件,使用 setup-x86.exe 或 setup-x86_64.exe安装器另外安装。

cygwin使用

点桌面图标快捷方式,进入cygwin命令行窗口,假装你在linux下,尽情使用吧,因为绝大多数操作都是兼容的。

cygwin文件系统与windows目录之间的对应

  • cygwin的根目录,其实就是cygwin安装目录,按前面的目录就是 D:\cygwin.
  • windows下的盘符,已被挂载到 /cygdrive/c, /cygdrive/d, /cygdrive/x ...

实用技巧

  • cygwin窗口里,鼠标圈选的,就自动复制到windows剪贴板。
  • Shift + Insert,从windows剪贴板粘贴。
  • 双击自动选择连续内容,很方便。
  • 单引号括起来的windows风格的路径。举例快速进入目录 F:\software\tools 可以这样  cd 'F:\software\tools'
  • Ctrl + 鼠标滚轮,调整字体大小。
  • 窗口标题栏点右键 - Option, 还有一系列选项。

一些事实

  • 需要注意的是,cygwin下的软件,都是.exe格式的,原生的linux二进制文件是不能运行的。如果cygwin里没有要用的软件,可以尝试在cygwin下从源码编译。

一些经验

  • cygwin本身是支持x-window的,不过效果实在不怎么样,使用还很烦琐;我想你肯定看不下去、而且用不下去的。所以,不推荐安装图形化的工具了,占磁盘空间而用又没用。如果你使用gitk以图形化查git历史的话,参考 在cygwin里调用windows版git-scm的gitk/git-scm与cygwin协同工作
  • 网上有些文章建议把cygwin目录加入到windows环境变量,不推荐修改,毕竟cygwin与windows的cmd是不同的东西,混用会有些乱,有可能带来莫名其妙的问题。
  • 可以通过 cd c: 进入windows的c盘,甚至可以通过 cd C:\tools 进入子目录;但列强反对这么用,使用windows风格的路径,请一定用单引号括起来。原因 反斜线在bash里当作转义符使用。这样 cd C:\tools 事实上相当于 cd C:tools,这样写cygwin认可。而cd c:\tools\disk相当于cd: c:toolsdisk,自然是错误的。
  • 默认情况下,windows的PATH环境变量,会被追加到cygwin的PATH环境变量中。于是,在cygwin下可以直接调用相关的windows程序。然而,这会造成一些麻烦。比如,安装过windows版ssh客户端,但没有安装cygwin版,在cygwin可以直接使用ssh,但它并不使用 ~/.ssh/下的密钥或匹配文件。这是自然而然的,并且是合理的,可如果不知道“是windows版ssh在工作”的这个事实,这会很令人困惑。

 

 

 

cygwin下一些包名与命令不一致的包的安装(telnet,dig,netstat等)及ping方案

cygwin下有一些命令,按命令名在setup里搜索不到的,每次安装都要google,汇总记录备忘于此。

telnet, 包名 inetutils ,属于 Net 类

dig, 包名 bind-utils ,属于 Net 类

FreeTDS-devel,替代包名 libsybdb-devel (libraries to connect to MS-SQL and Sybas databases development), 用来安装pymssql时会需要freeTDS开发包的sqlfront.h文件(比如pip install pymssql 时报错 sqlfront.h: No such file or directory ),但cygwin中并没有freetds-devel, 这时安装 libsybdb-devel可通过。事实上,在cygwin里libsybdb 是freetds的依赖包,而libsybdb-devel 并没有随之安装,需要编译时自然是找不到头文件了,这在cygwin官方文档的里有提到的: https://cygwin.com/packages/summary/freetds-src.html

可以使用windows版代替的包

win32默认是ansi/gbk编码,默认输出是乱码,可以使用iconv转换一下

ping,nslookup

中文windows环境下ping乱码方案参看本文后

cygwin里没有,或暂时还没找方案的包

netstat, 好像没有这个工具,使用windows的版本吧....

nslookup

windows版工具输出乱码的解决方案

ping,nslookup等工具只能使用windows版的,但是windows默认是本地化ansi编码,在cygwin下显示为乱码。更麻烦的是,因为乱码内容骗死人不偿命,看下图里的ip地址cygwin_ping 看ip地址被煞有其事的显示成什么样子!

解决方案如下:

新建一个文件 /usr/local/bin/ping

#!/usr/bin/env bash
echo "## this is windows ping, not cygwin/gnu ping"
echo " for help: ping /? "
ping.exe $* |iconv -c -f gbk -t utf-8

创建一个符号链接,并赋执行权限

chmod +x /usr/local/bin/pin

重新打开cygwin的shell

netstat, nslookup等可如法炮治。

#!/usr/bin/env bash
echo "## this is windows netstat, not cygwin/gnu netstat"
echo "    for help:  netstat /? "
netstat.exe $* |iconv -c -f gbk -t utf-8

其他有用软件的包

Scheme解释器(lisp方言Scheme的运行环境):chicken

chicken: A practical and portable scheme system. 在setup中搜索sheme搜不出来中,要搜索chicken.  The CHICKEN Scheme interpreter.

GNU common lisp解释器,直接搜索clisp即可搜索出来。

在cygwin里调用windows版git-scm的gitk/git-scm与cygwin协同工作

20161216更新:

如果安装了git-scm的  Git-2.11.0-64-bit.exe,将如下命令加入~/.bashrc,重启cygwin即可(32位版本及以后的新版本应该是类似的)。

alias gitk='/cygdrive/d/Program\ Files/Git/cmd/gitk.exe'
. /cygdrive/d/Program\ Files/Git/mingw64/share/git/completion/git-completion.bash

假设git-scm安装在 D:\Program Files\Git

上面第一行命令是把gitk别名到windows版gitk的程序位置。第二行是执行git-completion以让git支持自动补全,方便使用,注意开头点号后面有个空格。


git-scm windows版的安装选项

以从 git-scm官方下载的Git-2.11.0-64-bit安装为例,典型的windows程序安装流程,可以一路下一步到底;不过有几步强烈建议按下面的选择

安装位置 ,推荐安装到D盘;重装windows后git还可直接使用

windows shelll集成选项。如果平时主要使用cygwin里的命令行版git、windows版只使用gitk看版本历史(推荐),建议全部取消选择。当然这里也可以保持默认选项。(新版本的git-scm在这里增加了几个选项,其中一项为 "Git LFS(Larget File Support)",推荐选中;其它的,自然就没必要。 [update 2019/09/15] 

强烈建议选第一项,只在Git Bash里使用git。强烈反对在windows cmd中使用git。推荐平时使用cygwin里的命令行版git。

强烈建议选第三项,不要让git自作聪明的修改换行风格,以避免被同伴鄙视+痛恨!

保持默认。强烈反对在windows cmd中使用git bash。事实上更推荐使用cygwin里的shell bash


旧文章归档

下面是操作方法适合早期版本,具体截止哪个版本号不明;内容是2014年底所写。

[标题] 在cygwin里调用windows版git-scm的gitk/git-scm与cygwin协同工作

-----------本文前面部分废话比较多,可以直接跳过前五段,阅读下一条分隔线后--------------------

前言

cygwin作为潜伏在windows里的类unix/linux操作系统,堪称神器,几乎可以运行一切unix工具,甚至连gui版的unix软件也可以用cygwin-X模拟。但是这个X实在太丑陋了,使用也不方便。不过,事实上,我们用cygwin主要是使用grep, cut, vim, git 等这些经典的的unix工具,而不是gui;毕竟gui也不是unix/linux的擅长项。

对于使用git的朋友,应该更依赖cygwin下的命令行版git,自由,快捷,随心所欲。然而要查阅版本历史时,还是gui版的git更直观。

而windows版git-scm自带了git gui/gitk工具,可以在git bash里运行gitk调用,这点与unix/linux下的git一致,使用还是比较方便的;但git bash有个硬伤,工具太少,而且shell太傻,完全是windows命令提示符的风格,通过鼠标做选择复制等操作,几乎是脑残得令人无语;比cygwin差了N个星系的距离。

于是:如果能在cygwin直接调用win32下git-scm的gitk,就完美了。

然而,一直没有找到方法,连万能的google也没帮上忙。经过艰苦卓绝的不懈努力,终于找到了办法,并发现多次尝试错误的原因。

----------------- 前面废话多;下面是原理,不想看可跳到下条分隔线(十段之后) ------------

原理简析

假设win32版git-scm装在 D:\Program Files\Git ,那么gitk位于 D:\Program Files\Git\bin\gitk 该文件是一个bash风格的脚本,它是由D:\Program Files\Git\bin\wish.exe 所调用执行的。

在windows开始菜单的git子项里,查看“git gui”的属性,会发现它是一个快捷方式,指向 "D:\Program Files\Git\bin\wish.exe" "d:\Program Files\Git\libexec\git-core\git-gui"  其中的gui-gui同样也是个bash风格的脚本,由wish调用。

因为cygwin本身支持windows原生的win32程序,执行该wish.exe并带上相应的参数,就可以调用这些bash风格脚本。

原理就是如上这些。我们按照cygwin风格重写这些命令。

在cygwin里,windows盘符挂载到/cygwin/下,形式如/cygdrive/c, /cygdrive/d ... 那么,上述wish.exe 在cygwin里,路径即

/cygdrive/d/Program\ Files/Git/bin/wish.exe
路径中的空格,要做转义。

后面要带上参数,这个参数要使用windows风格的路径,因为wish.exe是win32程序,它的参数是win32风格的。gtk的脚本即如下

/cygdrive/d/Program\ Files/Git/bin/wish.exe "D:\Program Files\Git\bin\gitk"

wish的参数加了双引号,这也是win32风格。可以在cygwin下切换到一个git项目目录里,执行上面的命令测试一下。

以cygwin里创建一个命令别名 gitk 到上面的命令上,如下

$ alias gitk='/cygdrive/d/Program\ Files/Git/bin/wish.exe "D:\Program Files\Git\bin\gitk"'

然后执行gitk即可,与git-scm的bash环境里执行gitk一样。不过这只能在本次会话中有效,将其放到 ~/.bashrc 里,后面增加如下一行

alias gitk='/cygdrive/d/Program\ Files/Git/bin/wish.exe "D:\Program Files\Git\bin\gitk"'

大功告成。

如果需要在cygwin里使用git gui的话,方法类似。

-----------------只想看解决方案者,可以直接从这里开始看 --------------------

一句话操作

假设win32版git-scm装在 D:\Program Files\Git  .  在cygwin里修改 ~/.bashrc 文件,追加如下一行:

$ alias gitk='/cygdrive/d/Program\ Files/Git/bin/wish.exe "D:\Program Files\Git\bin\gitk"'

保存后,启动cygwin即可。

如果不明白,建议看前文的原理部分

使用wget抓取网页内容,常规用法及有用参数

环境:linux系统(各种发行版皆可),windows下强烈推荐cygwin环境

常规用法:

  1. 直接下载一个文件,默认按最后一级文件名保存到本地: wget {your-url}
  2. 如需自定义保存文件名则增加参数 -O 指定保留文件路径: wget -O {save-file-name} {your-url}
  3. 下载一批文件,把文件路径放到一个文本文件中,每行一个: wget -i {file-name-of-your-filelist}
  4. 下载一个页面及页面中图片等元素,wget -p {your-url}   ,即增加参数 --page-requisites (缩写为-p)
  5. 按网址中目录及文件名存储下载文件,即与源站同样的目录结构,增加参数 --force-directories-x

一些有用参数设置

  1. 指定user-agent 参数: -U {agent-string}--user-agent={agent-string}
  2. 批量下载时设置请求间隔:--wait={秒数}-w {秒数}
  3. 请求随机间隔,增加 --random-wait 参数,将以wait指定秒数0.5-1.5倍随机等待:
  4.  递归下载 -r ,一般还要同时指定--domains, --exclude-domains, --level 等限制下载内容
  5. 同时下载http页面中的图片等元素--page-requisites 缩写为-p
  6. 支持断点续传 -c
  7. 维持请求间的cookie参数 --save-cookies={saved_file_name} ,如需要同时追踪session的cookie,则增加 --keep-session-cookies,如需要加载以前wget保存的cookie,可使用--load-cookies={saved_file_name}
  8. 指定自定义的http头 --header={header-line},多个头则多次指定该参数
  9. 设置网络超时 --timeout={秒数}-T,设置后 --dns-timeout, --connect-timeout, --read-timeout 也将一起设置,当然也可以另外为它们单独设置。

设置代理

wget不支持socks代理,支持http,https,ftp三类代理,分别为https_prox, /http_proxy, ftp_proxy,下面示例只以http_proxy为例。为wget指定代理有三种方法,推荐第三种

  • 设置环境变量 export http_proxy=http://127.0.0.1:8080
  • 配置文件 /etc/wgetrc或 ~/.wgetrc
  • 在wget 命令行中通过 -e参数(临时设置环境变量)-e参数本身是执行命令,与wgetrc中的设置效果相同。示例:-e "http_proxy=http://127.0.0.1:8080"

更多参考

修订于 2019/12/09

--------- 后面是以前的2013年以前的版本,没啥用,不用看了 ------

需要采集一批数据,是一网站上的产品信息,产品本身信息很简单,使用火车采集器轻松实现;但产品价格数据是ajax响应数据,使用firebug + live http headers抓到该请求,并测试重发,发现该ajax请求必须带一个http头“X-Requested-With: XMLHttpRequest”,没有就返回404错误。

gnu/linux下有大量的杀手级工具,这种情况,要动用其中的wget. wget有很多参数,这里需要使用其中两个:-O,--header. 其中:

-O, 把请求结果保存到指定文件,但我们要使用的却是一个特殊的值:“-”,它可以将结果输出到标准输出

--header, 结http请求加上自定义的头(http header)

于是对于每条产品数据,都发送这样的请求:

wget --header="X-Requested-With: XMLHttpRequest" -O save_123.txt "http://www.website.com/request/path/?Id=123"

这样每条产品都保存到save_123.txt,save_124.txt,save_125.txt....这样的一系列文件中。不过有个问题是,每条数据一个文件,后期分析不方便。所以将其存储到单一的文件里。

方案:先将wget结果指向到标准输出,然后再使用重定向符 >> 定向到单一的文件里。

不过,还有一个问题,每个http响应里没有产品id号,数据跟采集到的产品信息对不上号。于是在每写一笔采集结果前,往文件里先写入该产品的id号。

这里使用echo 命令,要用到echo 的参数:-e, 作用是使用转义符输出换行。示例:echo -e "aaa\nbbb"

于是构造这样的bash脚本:

echo -e "\n"10011"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10011" >>data.log; 
echo -e "\n"10012"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10012" >>data.log; 
echo -e "\n"10013"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10013" >>data.log; sheep 1;
echo -e "\n"10014"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10014" >>data.log; 
echo -e "\n"10015"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10015" >>data.log; 
echo -e "\n"10016"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10016" >>data.log; sheep 1;

第三行加一个sheep 1, 即每采三条暂停1秒钟,作用是防止请求过于密集而影响服务器响应,暂停秒数按实际情况设置。

所有数据都保存到data.log文件里,里面格式如下

10011    
{"data":.....}
10012    
{"data":.....}
10013    
{"data":.....}
10014    
{"data":.....}

每两行一笔数据,其中第一行是产品id号,第二行是采集到的数据。这样就可以方便的提取其中数据了。

其实,对于而需要提取的数据,完全可以通过grep从定向到标准输出的wget结果里提取。只是这里不么做了。

使用cygwin在windows下自动备份目录数据/注册cygwin为windows服务

windows下备份目录是个蛋疼的事情,而linux的备份功能实在彪悍的让人感激涕零,然而对于出卖灵魂维护windows服务器的人士,在鄙视windows之余,还是得解决这个问题。突然想到cygwin这个强大的工具,是否可以在windows下使用它crond/crontab呢?查了一下,还真的有。

,先记来来,有时间研究一下

http://blog.csdn.net/cg_cheng/article/details/4377307  在cygwin下配置crontab

http://www.cnblogs.com/alaska1131/articles/1655643.html   windows下启动cygwin的cron/crontab

在Cygwin里安装使用dig命令/How to install dig on Cygwin

How to install dig on Cygwin

Here's a synopsis of how I installed dig on Cygwin:

1. Run the Cygwin setup and for the download site use:
ftp://sunsite.dk/projects/cygwinports

[推荐使用国内源http://mirrors.163.com/cygwin/]
2. Install the "Bind" package.

3. Determine the DNS being used.
ipconfig /all

4. Create the /etc/resolv.conf.
nameserver <DNS IP>

If this is not done, you'll get the error "communcations error: connection reset" when you run dig.

5. Run dig

from http://www.otweb.com/phramework/pw/module/blog/index.php?id=862