存档

2012年2月 的存档

python程序文件名和模块名相同引发的血案

2012年2月29日 1 条评论

血案回放:

在练习写一个使用optparse模块的练习脚本,命名为optparse.py

#!/usr/bin/python
from optparse import OptionParser
parser=OptionParser()
parser.add_option("-f", "--file", dest="filename",
                  help="write report to FILE", metavar="FILE")
parser.add_option("-q", "--quiet",
                  action="store_false", dest="verbose", default=True,
                  help="don't print status messages to stdout")
(options, args) = parser.parse_args()

看着眼熟?没错,就是官方的一个例子。有错误?反正我没看出来

但是执行 ./optparse.py 会报错

Traceback (most recent call last):
  File "./optparse.py", line 2, in <module>
    from optparse import OptionParser
  File "optparse.py", line 2, in <module>
    from optparse import OptionParser
ImportError: cannot import name OptionParser"

进入python的CLI模式

[root@node1 ~]# python
Python 2.6.5 (r265:79063, Nov 12 2010, 00:45:29) 
[GCC 4.4.4 20100525 (Red Hat 4.4.4-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import optparse
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "optparse.py", line 2, in <module>
    from optparse import OptionParser
ImportError: cannot import name OptionParser

很奇怪的错误吧,开始怀疑是不是没有optparse模块

[root@node1 ~]# python
Python 2.6.5 (r265:79063, Nov 12 2010, 00:45:29) 
[GCC 4.4.4 20100525 (Red Hat 4.4.4-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.path
['', '/usr/lib/python26.zip', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/site-packages', '/usr/lib/python2.6/site-packages/gtk-2.0', '/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info']

搜索sys.path路径

[root@node1 ~]# find /usr/lib/python2.6/ -name "optparse*"
/usr/lib/python2.6/optparse.pyc
/usr/lib/python2.6/optparse.py
/usr/lib/python2.6/optparse.pyo

说明optparse模块是有的。

为此我纠结了2个小时。中间吃了个饭回来,发现当前目录下有个optparse.pyc ,想到是不是python把我新建的文件当成模块了,然后再回头看sys.path,发现第一项是””,然后豁然开朗,python加载模块的时候就会从当前路径先找,而我在当前目录建立了个模块文件相同名字的py程序,所以就会加载失败,报错。为了验证我的想法我把py程序的名字改成optparse2.py,运行

[root@node1 ~]# mv optparse.py optparse2.py
[root@node1 ~]# rm -rf optparse.pyc
[root@node1 ~]# python optparse2.py 
None

运行没有问题,不报错了。

结论:在命名程序文件的时候,要避免和模块文件重名。如果程序只自己用的话,从sys.path里把“”放在最后。

分类: 关于技术 标签:

[转载&mark]使用git打包RPM

2012年2月6日 没有评论

写好程序,编辑好makefile后,就可以按照以下方法获得spec文件了。

$ cd hello-0.2 你的源代码目录
$ git init 初始化git
Initialized empty Git repository in /home/admin/work/hello-0.2/.git/
$ git add -A
$ git commit -m init
 3 files changed, 73 insertions(+), 0 deletions(-)
 create mode 100644 Makefile
 create mode 100644 hello.c
 create mode 100644 hello.spec
$ git archive --prefix=hello-0.2/ master|gzip > hello-0.2.tar.gz
$ ls
hello-0.2.tar.gz  hello.c  hello.spec  Makefile 生成了spec文件
$rpmbuild –ba hello.spec 就会生成RPM包了~

 

学习git的时候,在这里发现的。

分类: 关于技术 标签: ,

puppet dashboard安装备忘-数据库

2012年2月3日 没有评论

执行rake RAILS_ENV=production db:migrate之前必须配置database.yml文件,

cp yourapp/config/database.yml.sample database.yml

然后去修改,database.yml文件里面有说明。 也可以参考rubyonrails官方文档

我遇到的错误及解决方法:

提示缺包:直接gem install XXX

执行rake RAILS_ENV=production db:migrate的时候提示“找不到 /tmp/mysql.sock”或者“数据库未配置”

解决方法:1、找到你的mysql.sock路径(查看my.cnf可以看到路径) 做个软连接

ln –s /path/to/mysql.sock /tmp/mysql.sock

2、修改my.cnf [mysqld] 区块的

socket=/var/lib/mysql/mysql.sock =>socket=/tmp/mysql.sock

    然后重启mysql server

3、修改yourapp/config/database.yml使用host+port的方式连接数据库,指定host和port。

分类: 关于技术 标签: , , ,