基礎知識準備:
1.linux下的export命令?
在shell中輸入export,執行如下:
[newweb@localhost //]$ exportdeclare -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_PATHexport 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/shexport 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 definitionsif [ -f /etc/bashrc ]; then . /etc/bashrcfi# User specific aliases and functionsexport PATH=$PATHexport LANG=zh_CN.utf-8export LC_CTYPE=zh_CN.UTF-8
~/.bash_profile
# .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then . ~/.bashrcfiPATH=$PATH:$HOME/bin:/usr/local/csl-gcc/binexport PATHexport 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/libexport PYTHONPATH=$PYTHONPATH
可以看到,這裡定義的指令碼對全域定義的$PATH進行了一種擴充(理解可能偏頗,不吝賜教)。
於是,在這個shell指令碼中加入了這幾個環境變數,即可成功:
形如:
#!/bin/shsource /etc/bashrcsource /etc/profilesource ~/.bash_profilesource ~/.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 syssys.path.append("test檔案夾路徑")#在import t1import t1
b. 在作業系統的變數上設定
PYTHONPATH=test檔案夾路徑,而不需要添加到PATH中去。
設定好後,在任意地方執行sys.path,就可以看得該路徑,可以匯入。如:
C:\Documents and Settings\Administrator>pythonPython 2.6 (r26:66721, Oct 2 2008, 11:35:03) [MSC v.1500 32 bit (Intel)] on win32Type "help", "copyright", "credits" or "license" for more information.>>> import sys>>> a = sys.path>>> for b in a:... print b...G:\helloworld\test1C:\Python26\python26.zipC:\Python26\DLLsC:\Python26\libC:\Python26\lib\plat-winC:\Python26\lib\lib-tkC:\Python26C:\Python26\lib\site-packages
當然中間還有很多東西,省略了。
Linux中也是一樣,採用export PATHONPATH=$PATHONPATH:自己定義的一個路徑。可以採用sys.path,也可以採用export 的方式。
參考:http://archive.cnblogs.com/a/2098636/ ,用python調用c,c++的庫的方法。
流水賬算是記完了。