Wednesday, March 25, 2015

Python跨平台需要注意的问题

最近在写一个Python小程序,需要移植到windows上,遇到了几个小问题,记录一下。

可以使用sys.platform判断系统类型

ossaudiodev在Windows下不可用,用PyAudio替代

Windows在使用open打开文件时会区别'rb'和'r',而Linux的'r'和'rb'是等价的。因此在Windows下打开二进制文件必须用'rb'模式

Windows7下的Python在读取用户给定的中文路径时会出错,要先把路径转换到unicode,可以使用uni_path = unicode(path, "utf8")

PyGTK写的程序会变得很丑,暂时还不知道怎么解决。以后改用PySide好了

在Windows下最好把Python安装目录放到PATH环境变量里,这样比较方便用pip

Saturday, March 7, 2015

Gnome 3.14添加自动启动

Fedora21已经找不到gnome-session-properties了,虽然gnome-tweak-tools提供了添加子启动程序的功能,不过相当鸡肋。最后找到一个方法可以实现原来gnome-session-properties的功能

在~/.config/autostart/下新建一个xxx.desktop文件,内容如下:
[Desktop Entry]
Type=Application
Name=xscreensaver-autostart
Comment=Autostart xscreensaver
Exec=/usr/libexec/xscreensaver-autostart
Terminal=false
X-Desktop-File-Install-Version=0.22
X-GNOME-Autostart-enabled=true
OnlyShowIn=GNOME;

要注意的是,Exec后面必须是程序的完整路径。

真心想吐槽Gnome,怎么越改越麻烦了。

Wednesday, March 4, 2015

Python学习笔记之subprocess

Python提供了一个库,subprocess,可以很方便地启动一个子进程并与之交互。

最简单的使用方式是:
subprocess.call(args),其中的args是a list of strings,args[0]是调用的程序路径,其后均为参数。call会阻塞直到子进程结束。call的返回值是子进程的返回值。这个函数与C的system很相似。

subprocess.check_output(args)与call相似,不过它会把子进程的输出作为一个bytestring返回

这个库最强大的函数是Popen,它其实是一个类的Constructer,完整形式是:
subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

args与上文相同,不过这个调用不会阻塞当前进程,stdin,stdout,stderr可以是一个打开的file,或者是subprocess.PIPE,如果是PIPE,父进程可以用xxx.stdin/stderr/stdout与子进程通信。

其实呢,上述这些函数都是C的fork和execve的包装,它们大大简化了编程。如果要在C下实现Popen的功能,父进程需要现用pipe获得一个管道,然后fork,在子进程中关闭管道写端,用dup2重定向管道到stdin,接着execve,在父进程中需要关闭管道读端,然后向子进程输入数据,这些代码少说也要个5行。

现在觉得Python的官方库文档已经很完善了,而且不要翻墙,以后估计就不再写官方库的学习笔记了