点滴记录python linux中的个人经验
基础知识准备:
1.linux下的export命令?
在shell中输入export,执行如下:
[newweb@localhost //]$ export declare -x BOOST_ROOT="/usr/local/boost" declare -x CLASSPATH=".:/usr/local/jdk/lib" declare -x CVS_RSH="ssh" declare -x G_BROKEN_FILENAMES="1" declare -x HISTFILE="/backup/loghistory/newweb/192.168.63.132.loghistory.20120711_142258" declare -x HISTSIZE="2000" declare -x HISTTIMEFORMAT="[%F %T] " declare -x HOME="/home/newweb" declare -x HOSTNAME="localhost" declare -x INPUTRC="/etc/inputrc" declare -x JAVA_HOME="/usr/local/jdk" declare -x LANG="zh_CN.utf-8" declare -x LC_CTYPE="zh_CN.UTF-8" declare -x LD_LIBRARY_PATH="/home/newweb/lib:/usr/local/bootstrap/lib:/usr/local/boost/lib:/usr/local/lib:/home/newweb/MyLib/Clib:/usr/local/curl/lib:." declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s" declare -x LOGNAME="newweb" declare -x LOG_SFTP="1" declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:" declare -x MAIL="/var/spool/mail/newweb" declare -x OLDPWD="/home/newweb/scripts/TNQEngine" declare -x ORACLE_HOME="/usr/lib/oracle/11.2/client64" declare -x PATH="/usr/kerberos/bin:/usr/local/jdk/bin:/usr/local/python/bin:/usr/local/csl-gcc/bin:/usr/local/curl/bin:/usr/lib/oracle/11.2/client64/bin:/usr/local/php/bin:/usr/bin:/bin:/usr/sbin:/sbin:/home/gluster/lib:/home/newweb/bin:/usr/local/csl-gcc/bin" declare -x PWD="//" declare -x PYTHONPATH="/home/newweb/lib" declare -x SFTP_LOG_FACILITY="10" declare -x SFTP_LOG_LEVEL="3" declare -x SFTP_PERMIT_CHMOD="1" declare -x SFTP_PERMIT_CHOWN="1" declare -x SFTP_UMASK="" declare -x SHELL="/bin/bash" declare -x SHLVL="1" declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass" declare -x SSH_AUTH_SOCK="/tmp/ssh-tVtCB20374/agent.20374" declare -x SSH_CLIENT="192.168.63.132 3717 2188" declare -x SSH_CONNECTION="192.168.63.132 3712 192.168.0.36 2344" declare -x SSH_TTY="/dev/pts/3" declare -x TERM="vt100" declare -x USER="newweb"
可以看到有很多类似字典数据给出,比如PATH="", LD_LIBRARY_PATH="",本身export的值是可以自定义的,但是有一些是系统预设的,所以,千万不要干覆盖的操作,除非你知道怎么回事。
比如以下情况:
a. PATH变量
[root@mysqlc1 ~]# export PATH="helloworld" [root@mysqlc1 ~]# ll -bash: ls: command not found [root@mysqlc1 ~]# vi /etc/profile -bash: vi: command not found
这种情况是属于修改当前环境变量,所以,是当前的ll命令不在能使用了,也就是一个临时修改。如果我们在启动一个session连接,那么这个ll命令是可以继续使用的。但是,如果在/etc/profile文件中添加上这条语句,那么情况将完全相反。
编辑/etc/profile文件
[root@mysqlc1 ~]# vi /etc/profile 在文件最后输入: export LD_LIBRARY_PATH export PATH="hellworld" wq保存退出后,当前环境将继续能够正常使用ll命令
但是,在启动一个session的时候,将不在能够使用。linux系统的机器于大多数使用者而言,绝对不是个人计算机,而是多人共同开发的服务器,如果犯这样的错误,而不清楚什么时候犯的,并且原来的path等等丢失什么的。很不乐观。
b. MAIL变量。
系统日志文件。linux最常用的定时任务,可以依靠这个文件来进行查看。当然,该文件一般很大,切忌不要用vi打开,最好还是tail -f /var/spool/mail/newweb
2. c的动态链接库?
请参考:http://mypyg.iteye.com/blog/845915
关于C,水平不行真不能说什么,只是知道在windows中的dll,linux中的so文件,都可以由c文件进行编译,链接生成,而生成的这些文件,是可以引用的。而这里和export有关的就是:
LD_LIBRARY_PATH, 该变量存储的是所有可能应用的动态链接的路径。即linux操作系统在解析一个引用第三方库文件的时候会去查找这个变量对应的文件,如果查找不到,那么程序会退出!
当然,我在这里遇到的情况是:在shell交互模式下执行程序,正常执行,但是,将命令作为定时启动型任务,却失败!
a. 脚本:
#!/bin/sh
/usr/local/bin/python /home/newweb/scripts/main.py
这里简化了其他一些进程数量判断的代码,以防冲淡了核心。
即同样一样代码,在交互模式下能执行,但是在定时启动时却不能启动,同时,如果在shell脚本中使用python,而不使用python命令的全路径,那么使用的python将是2.4的!而实际上我希望使用的是python2.6的,真是的,问题貌似一大堆,其实,到最后,实际上问题是一个!
即crontab命令是以什么用户执行一些命令,他们使用的环境变量是谁的,不出意外,都是root的。赖和我没有root用户权限,无法切图。
继续寻求最好的解决方案。
python版本不对,那么我在shell中用全路径的python去执行呗,但是仍然在定时执行程序的时候发生错误,因为这里使用了一个libboost_python编写的第三方python扩展,要了老命了,查看前面提到的日志文件,提示import error: cannot import libboost_python.so.1.44.0,那么这里就该是crontab执行的路径不包括我们在交互环境下执行的环境了。将交互模式下的LIB_LIBRARY_PATH加入到这个shell不就行了。
形如:
#!/bin/sh export LD_LIBRARY_PATH="/home/newweb/lib:/usr/local/bootstrap/lib:/usr/local/boost/lib:/usr/local/lib:/home/newweb/MyLib/Clib:/u sr/local/curl/lib:." /usr/local/bin/python /home/newweb/scripts/main.py
这样处理以后程序就能正常执行了,但是,此次是这样,下次又有其他的环境变量呢?
还记得刚才我们编辑过的/etc/profile文件吗?这个文件我们都是在最后给他加个执行变量。就可以达到全局设置环境变量了,而同时,每个用户都有一个自己的环境变量设置,他们的关系?
我以为的是共的配置执行完了执行执行每个用户私有的环境变量配置,
分别是该用户根目录下的隐藏文件~/.bash_profile,~/.bashrc
~/.bashrc:
# .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # User specific aliases and functions export PATH=$PATH export LANG=zh_CN.utf-8 export LC_CTYPE=zh_CN.UTF-8
~/.bash_profile
# .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi PATH=$PATH:$HOME/bin:/usr/local/csl-gcc/bin export PATH export LD_LIBRARY_PATH=$HOME/lib:/usr/local/bootstrap/lib:/usr/local/boost/lib:/usr/local/lib:/home/newweb/MyLib/Clib:/usr/local /curl/lib:. PYTHONPATH=$HOME/lib export PYTHONPATH=$PYTHONPATH
可以看到,这里定义的脚本对全局定义的$PATH进行了一种扩展(理解可能偏颇,不吝赐教)。
于是,在这个shell脚本中加入了这几个环境变量,即可成功:
形如:
#!/bin/sh source /etc/bashrc source /etc/profile source ~/.bash_profile source ~/.bashrc /usr/local/python/bin/python /home/newweb/scripts/main.py
这样就能保证在交互模式下能执行的程序放在crontab 里也能正常执行。
3. python的环境变量?
python的环境变量有什么好说的,很多python程序员最初接触2天就会接触到pythonpath,但是我也见过工作很久的python程序员对python导包的懵懂,甚至包的区别文件__init__.py文件的作用也不清楚,就是自己也不过是刚清晰一点点,汗颜,必须得记录下。
1. 在windows下的python路径怎么设置?
a. 如果你想在cmd里执行python脚本,请将python根目录设置到环境变量PATH中。即C:\Python26
b. 如果你想在cmd里执行形如django的django-admin命令什么的,C:\Python26\Scripts。
2. 假如现在有一个项目,形如:
test-
-> t1.py
test2-
->main.py
如果执行main.py,希望能够引入t1.py的内容,不管这个test文件夹在计算机的那个位置。
有2种方式:
a.在main.py中加入
import sys sys.path.append("test文件夹路径") #在import t1 import t1
b. 在操作系统的变量上设置
PYTHONPATH=test文件夹路径,而不需要添加到PATH中去。
设置好后,在任意地方执行sys.path,就可以看得该路径,可以导入。如:
C:\Documents and Settings\Administrator>python Python 2.6 (r26:66721, Oct 2 2008, 11:35:03) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> a = sys.path >>> for b in a: ... print b ... G:\helloworld\test1 C:\Python26\python26.zip C:\Python26\DLLs C:\Python26\lib C:\Python26\lib\plat-win C:\Python26\lib\lib-tk C:\Python26 C:\Python26\lib\site-packages
当然中间还有很多东西,省略了。
Linux中也是一样,采用export PATHONPATH=$PATHONPATH:自己定义的一个路径。可以采用sys.path,也可以采用export 的方式。
参考:http://archive.cnblogs.com/a/2098636/ ,用python调用c,c++的库的方法。
流水账算是记完了。