Python Land 有趣的梦想

业余时间做一点孩子们的 python 教育,看到他们,想起自己当年在少年宫、少科站的日子。

为了把课上好,我也是的确是动了很多脑筋。包括这次为了让现在已经沉溺于游戏的孩子们索性更加有兴趣一些,终于给购买的 rpgmaker mv 找到一个好的用途,目标是制作一款学习 python 的 rpg 游戏。现在为了给孩子们测验,完成了很简单的第一关,三道题目的测验。

屏幕快照 2016-04-16 上午10.00.21

屏幕快照 2016-04-16 上午10.00.38

屏幕快照 2016-04-16 上午10.02.04

屏幕快照 2016-04-16 上午10.01.49

屏幕快照 2016-04-16 上午10.03.14

屏幕快照 2016-04-16 上午10.03.37

一开始的学习曲线总是比较长的,这星期所耗费的时间更多的还是在 rpgmaker 本身的学习,只有掌握了这个工具的使用才可以谈应用和创意。rpgmaker mv 这个版本也开始使用 javascript 作为扩充的语言,紧跟潮流,也带起了非常热闹的应用。看来,rpg 并不因为现在显卡的升级、3D 的广泛使用二落伍啊,游戏性本身还是最重要的。记得去年那个越南人写的什么小鸟,画面像素风格,却一度是 ios 平台上最吸金的游戏。

之前看到过一个学习 javascript 的 rpg 在线游戏,将游戏和学习巧妙的融合在一起,印象深刻。希望我的 Python Land 也能有趣好玩。(现在略有点无聊)

为了年少时候的承诺

以前用了很多盗版软件,最大的原因就是太贵,买不起,而不得不承认,正因为其中的一些软件,才让我有了今天的些许成绩。虽然不是自己的个人问题,曾几何时,这是一个普遍的社会现象。如同现在我们到国外,发现东西不贵啊,而且是人家几十年一直这个价格。

不是很懂宏观经济,反正现在可以支配的货币多了,很多软件都买得起了。office 和很多常用的共享软件已经用了很多年正版了,之前一直想入手 adobe lightroom,但是几千的价格还是有点下不了决心,最近发现,原来 adobe 已经学习 microsoft 了,软件可以用和会员结合的年服务费模式,并且有专门只使用 lightroom 和 photoshop 的摄影会员可供选择。

那就不要犹豫了,这个世界是公平的,每个人的贡献,汇聚在一起,力量会很大。如果只是吃吃喝喝混日子,有什么意义呢。

谢谢 lightroom,曾经处理了成千上万张照片,虽然佳作寥寥,但也带来了很多欢乐。

lightroom

2005年那时候,做过很多免费虚拟主机的计划,记得当时的网站叫做理想空间,现在我写一点很简单的开源软件,教教小孩子 python,好像这样更加有趣和有意义。自己年少时候的承诺总是要尽量去履行的。

于无声处

这是一步国内谍战电视剧,胡军、左小青等演的。

最近这些年,国产电视剧还是有很多佳作的。这部不错,剧本好,演员演技好。相对也比较真实,好人、坏人,都是有血有肉的人。

人生就是单行道,没有任何的机会掉头,哪一段重来。

从少时到如今已是中年,一路走来,自己觉得不容易。

现在觉得岁月的沧桑变迁并没有给我太大的改变,更多还是内省,如围棋复盘,看过去走错了哪里,虽然一边还是犯错,至少可以少错,以及弥补的快些。

小时候看过一部电影叫做“都市里的村庄”,改编自文革后的一部得奖话剧,也叫作“于无声处”。

当时应该是10岁多些,那个周日,我清晰的记得,和爸爸一起吃了西餐,看了电影,到爸爸单位,看到那时的电脑,在或许是foxbase的某个界面,傻乎乎的输入着刚背出来的圆周率。

记得那天,阳光是温暖的。还记得那部电影的女主角,儿时觉得漂亮的不得了。

几十年这样过去,有时候却还是任性的对父母,对自己。实在是不太应该。

夜深了,清明假期,就这样过去了。明天,人生继续。

python 创建模块时候的几个小坑

为了方便和同事们的协同开发,将自己写的有点代码都修改为模块,这几天在更新和测试中还是碰到很多问题。国内 python 开发虽然如火如荼,但是开发模块的人还是非常少,加上国人一般都是不太愿意分享的,只好慢慢看英文资料和测试了。

install_requires 的问题。

在 setup.py 中设置所有模块需要的参数等,其中 install_requires 是用来设置这个模块有什么依赖模块和版本的,但是如果你在 sdist 过程中针对这个 install_requires 报错了,那么最简单的方法是将

from distutils.core import setup

替换为

from setuptools import setup

对于 Pycharm 默认生成的 setup.py,的确生成的是前者,我也不清楚这是不是 pycharm 的 bug。

可以参考这个回答

You are not allowed to edit ‘…’ package information 问题。

在第一次上传 pypi 的时候,或许你会得到这样的错误信息,那么必须先执行:

python setup.py register

然后再执行

python setup.py sdist upload

这样就可以了。可以参考这个回答

setup.py 文件包括其他文件

即便在 MANIFEST.in 文件中包括了想要的测试或者数据文件,我发现还是没有在安装包中有相关的文件,一查资料,原来是要在 setup.py 中设置:

include_package_data=True

这样就可以了。

英雄本色之2016

17060755925bff6e03dyPV70t

2003年至今,每年的愚人节,因为哥哥,变得不同。

最多是90后了,还有些印象,对于哥哥。

很多年后,这个日子也就变得平常。

看一部英雄本色II,纪念一下。

以前不懂,现在明白一点,每个人都有自己的生活,别人总是不太懂的。

每一年,每一月,每一天都是挑战。回顾往事,觉得自己的确做了很多蠢事,只好归因到年轻和成长的代价了。

今天中午,见了以前的一个朋友,2006年时候,在我当时的公司的实习生,之后一直有联系,他也是个很随性的人,世界很小,多年以后,公司间的合作,居然还可以再碰到。

就做自己吧,不管是不是不落地的鸟,还是一道绚烂的烟火。

关于 python 的 __init__.py 最清楚的介绍

在写 python package 的时候,不可避免的和 __init__.py 打交道,查了很多资料,发觉下面的文章是介绍的最清楚的,来源 老王的python ,我重新整理了一下格式:

python 中的 Module 是比较重要的概念。常见的情况是,事先写好一个.py 文件,在另一个文件中需要 import 时,将事先写好的 .py 文件拷贝 到当前目录,或者是在 sys.path 中增加事先写好的 .py 文件所在的目录,然后 import。这样的做法,对于少数文件是可行的,但如果程序数目很多,层级很复杂,就很吃力了。

有没有办法,像 Java 的 Package 一样,将多个 .py 文件组织起来,以便在外部统一调用,和在内部互相调用呢?答案是有的。

主要是用到 python 的包的概念,python __init__.py 在包里起一个比较重要的作用。

要弄明白这个问题,首先要知道,python 在执行 import 语句时,到底进行了什么操作,按照 python 的文档,它执行了如下操作:

第1步,创建一个新的,空的 module 对象(它可能包含多个 module );
第2步,把这个 module 对象插入 sys.module 中
第3步,装载 module 的代码(如果需要,首先必须编译)
第4步,执行新的 module 中对应的代码。

在执行第3步时,首先要找到 module 程序所在的位置,其原理为:

如果需要导入的 module 的名字是 m1,则解释器必须找到 m1.py,它首先在当前目录查找,然后是在环境变量 PYTHONPATH 中查找。PYTHONPATH 可以视为系统的 PATH 变量一类的东西,其中包含若干个目录。如果 PYTHONPATH 没有设定,或者找不到 m1.py,则继续搜索 与 python 的安装设置相关的默认路径,在 Unix下,通常是 /usr/local/lib/python。

事实上,搜索的顺序是:当前路径 (以及从当前目录指定的 sys.path),然后是 PYTHONPATH,然后是 python的安装设置相关的默认路径。正因为存在这样的顺序,如果当前 路径或 PYTHONPATH 中存在与标准 module 同样的 module,则会覆盖标准 module。也就是说,如果当前目录下存在 xml.py,那么执行 import xml 时,导入的是当前目录下的 module,而不是系统标准的xml。

了解了这些,我们就可以先构建一个 package,以普通 module 的方式导入,就可以直接访问此 package 中的各个module 了。

Python 中的 package 定义很简单,其层次结构与程序所在目录的层次结构相同,这一点与 Java 类似,唯一不同的地方在于,python 中的 package 必须包含一个 __init__.py 的文件。
例如,我们可以这样组织一个 package:

package1/
__init__.py
subPack1/
__init__.py
module_11.py
module_12.py
module_13.py
subPack2/
__init__.py
module_21.py
module_22.py
……

__init__.py 可以为空,只要它存在,就表明此目录应被作为一个 package 处理。当然,__init__.py 中也可以设置相应的内容,下文详细介绍。

好了,现在我们在module_11.py中定义一个函数:

def funA():
    print "funcA in module_11"
    return

 

在顶层目录(也就是 package1 所在的目录,当然也参考上面的介绍,将 package1 放在解释器能够搜索到的地方)运行python:

>>>from package1.subPack1.module_11 import funcA
>>>funcA()
funcA in module_11

 

这样,我们就按照package的层次关系,正确调用了module_11中的函数。

细心的用户会发现,有时在 import 语句中会出现通配符 *,导入某个 module 中的所有元素,这是怎么实现的呢?
答案就在 __init__.py 中。我们在 ubPack1 的 __init__.py 文件中写

__all__ = ['module_13', 'module_12']

 

然后进入python

>>>from package1.subPack1 import *
>>>module_11.funcA()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named module_11

 

也就是说,以 * 导入时,package 内的 module 是受 __init__.py 限制的。

好了,最后来看看,如何在 package 内部互相调用。
如果希望调用同一个 package 中的 module,则直接 import 即可。也就是说,在 module_12.py 中,可以直接使用

import module_11

 

如果不在同一个 package 中,例如我们希望在 module_21.py 中调用 module_11.py 中的 FuncA,则应该这样:

from module_11 import funcA