亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 7458 | 回復(fù): 8
打印 上一主題 下一主題

suse10編譯python [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-09-23 23:13 |只看該作者 |倒序?yàn)g覽
在suse10上編譯帶有zlib, ssl, sqlite和readline的python 2.7

Posted in linux On 2010-09-29 03:10:42 .
準(zhǔn)備
下載:

http://www.sqlite.org/sqlite-amalgamation-3.7.2.tar.gz
http://www.openssl.org/source/openssl-1.0.0a.tar.gz
ftp://ftp.gnu.org/gnu/readline/readline-6.1.tar.gz

當(dāng)然還有Python的源碼

編譯
zlib:
在Python-2.7/Modules/zlib有zlib的源碼,configure/make/make install之

openssl, readline, sqlite:
都是configure(openssl里是config) /make/make install,注意readline模塊make install后要運(yùn)行l(wèi)dconfig,不然之后編譯出來的python會(huì)提示找不到readline模塊

python:
也是configure/make/make install,注意make完會(huì)提示哪里模塊不會(huì)編譯,如果里面出現(xiàn)了zlib/_ssl/_sqlite/readline則表示前面的安裝有誤。

到此為止,enjoy python 2.7

鏈接
1
2
3
rm /usr/bin/python /usr/bin/pydoc
ln -s /usr/bin/python /usr/local/bin/python
ln -s /usr/bin/pydoc /usr/local/bin/pydoc

openssl-1.0.0a.tar.gz

3.83 MB, 下載次數(shù): 22

sqlite-amalgamation-3.7.2.tar.gz

1.43 MB, 下載次數(shù): 16

readline-6.1.tar.gz

2.16 MB, 下載次數(shù): 21

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-09-24 23:52 |只看該作者
下載Python2.7

http://www.python.org/ftp/python/2.7/Python-2.7.tar.bz2

2、解壓縮到當(dāng)前目錄

tar jxvf Python-2.7.tar.bz2

3、編輯Modules/Setup.dist

找到SSL和zlib模塊,去掉某些注釋,結(jié)果如下:

# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/usr/local/ssl
ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto

# Andrew Kuchling's zlib module.
# This require zlib 1.1.3 (or later).
# See http://www.gzip.org/zlib/
zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz

4、安裝OpenSSL

apt-get install libssl-dev

5、編譯安裝Python2.7

./configure
make && make install

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-09-25 00:03 |只看該作者
為python安裝readline模塊 (readline模塊加載不成功) (2012-05-24 14:42:56)轉(zhuǎn)載▼
標(biāo)簽: 雜談        分類: 技術(shù)文檔
今天用戶說在使用安裝的python時(shí),無法調(diào)用readline模塊,我嘗試了一下,確實(shí)如此:
bash-3.00# /proj/application/tools/python7.1_sol/bin/python
Python 2.7.1 (r271:86832, Jul 18 2011, 14:44:34)
[GCC 3.4.3 (csl-sol210-3_4-branch+sol_rpath)] on sunos5
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import readline
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named readline
>>>
>>>

我記得我之前編譯安裝的時(shí)候,肯定安裝readline了,翻查上邊的記錄,我的確是加載了readline,但是這個(gè)模塊是否正常運(yùn)行,我也沒驗(yàn)證。為此,我重新安裝python,在make的過程中,查看是否有別的我沒有注意的問題。

Make過程太長(zhǎng),我摘錄最有一段進(jìn)行說明。

2.7.2/Modules/_ctypes/libffi/src/closures.o build/temp.solaris-2.10-sun4u-2.7/tmp/Python-2.7.2/Modules/_ctypes/libffi/src/dlmalloc.o build/temp.solaris-2.10-sun4u-2.7/tmp/Python-2.7.2/Modules/_ctypes/libffi/src/sparc/ffi.o build/temp.solaris-2.10-sun4u-2.7/tmp/Python-2.7.2/Modules/_ctypes/libffi/src/sparc/v8.o build/temp.solaris-2.10-sun4u-2.7/tmp/Python-2.7.2/Modules/_ctypes/libffi/src/sparc/v9.o -L/usr/local/lib -L. -lpython2.7 -o build/lib.solaris-2.10-sun4u-2.7/_ctypes.so -mimpure-text

Python build finished, but the necessary bits to build these modules were not found:
_bsddb             _sqlite3           _ssl           
_tkinter           bsddb185           gdbm           
linuxaudiodev      ossaudiodev                       
To find the necessary bits, look in setup.py in detect_modules() for the module's name.


Failed to build these modules:
_curses            _curses_panel      _locale        
readline                                             

running build_scripts
creating build/scripts-2.7
copying and adjusting /tmp/Python-2.7.2/Tools/scripts/pydoc -> build/scripts-2.7
copying and adjusting /tmp/Python-2.7.2/Tools/scripts/idle -> build/scripts-2.7
copying and adjusting /tmp/Python-2.7.2/Tools/scripts/2to3 -> build/scripts-2.7
copying and adjusting /tmp/Python-2.7.2/Lib/smtpd.py -> build/scripts-2.7
changing mode of build/scripts-2.7/pydoc from 644 to 755
changing mode of build/scripts-2.7/idle from 644 to 755
changing mode of build/scripts-2.7/2to3 from 644 to 755
changing mode of build/scripts-2.7/smtpd.py from 644 to 755
./install-sh -c -m 644 ./Tools/gdb/libpython.py python-gdb.py
bash-3.00#
這里,我們很清楚的可以看出,readline模塊build失敗了,我又查看是否build時(shí)有相關(guān)報(bào)錯(cuò),我發(fā)現(xiàn)build過程有下列不明顯的報(bào)錯(cuò):
building 'readline' extension
gcc -fPIC -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -I/usr/local/include -I/tmp/Python-2.7.2/Include -I/tmp/Python-2.7.2 -c /tmp/Python-2.7.2/Modules/readline.c -o build/temp.solaris-2.10-sun4u-2.7/tmp/Python-2.7.2/Modules/readline.o
/tmp/Python-2.7.2/Modules/readline.c:758: warning: 'on_completion_display_matches_hook' defined but not used
gcc -shared build/temp.solaris-2.10-sun4u-2.7/tmp/Python-2.7.2/Modules/readline.o -L/usr/lib/termcap -L/usr/local/lib -L. -lreadline -lncurses -lpython2.7 -o build/lib.solaris-2.10-sun4u-2.7/readline.so
Text relocation remains   

這個(gè)報(bào)錯(cuò)類似于python自己的module下,有它定義好的readline編譯方式,它和我在config時(shí),指定的readline有所沖突,不知道為什么,build時(shí)沒法使用。雖然我在configure時(shí),為此增加了很多參數(shù),比如LDFLAGS,比如CPPFLAGS,還比如我vi了setup.py文件,在# Platform-dependent module source and include directories
里定義了readline的位置,但是我們?nèi)詿o法加載readline。

我和同事查了很多的文檔和資料,最后我們發(fā)現(xiàn)有文檔說,我們需要修改某個(gè)配置文件,值得python的模塊可以正常調(diào)用。
在python安裝目錄下,有個(gè)名為Module的目錄,里邊有個(gè)Setup.dist的配置文件,基本需要加載的模塊都可以在里邊找到。

Vi這個(gè)文件,我們找到readline,會(huì)發(fā)現(xiàn)有簡(jiǎn)單的說明,并指明如果要定義一個(gè)全新的位置,我們可以通過參數(shù)修改
# GNU readline.  Unlike previous Python incarnations, GNU readline is
# now incorporated in an optional module, configured in the Setup file
# instead of by a configure script switch.  You may have to insert a
# -L option pointing to the directory where libreadline.* lives,
# and you may have to change -ltermcap to -ltermlib or perhaps remove
# it, depending on your system -- see the GNU readline instructions.
# It's okay for this to be a shared library, too.

#readline readline.c -lreadline –ltermcap

改為:(去掉注釋符,指定它的include和lib的位置)

readline readline.c -I/proj/application/tools/readline-5.2-sol/include -L/proj/application/tools/readline-5.2-sol/lib -R/proj/application/tools/readline-5.2-s
ol/lib -lreadline –ltermcap

修改后,我們?cè)俅螐男戮幾g。
安裝python我們需要sqlite模塊,所以我事先安裝好了,臨時(shí)設(shè)置一下環(huán)境變量
export PATH=/proj/application/tools/sqlite-3.7.2-sol/binPATH
export LD_LIBRARY_PATH=/proj/application/tools/sqlite-3.7.2-sol/libLD_LIBRARY_PATH

再次編譯時(shí),我沒有像以前一樣去改python的setup.py文件,我們做過多次的測(cè)試,只要指定好環(huán)境變量,應(yīng)該很順利。
./configure --prefix=/proj/application/tools/python-2.7.2/ --enable-shared
Make
Makeinstall

沒有任何報(bào)錯(cuò),readline模塊也加載正常。

測(cè)試:
bash-3.00# cd /proj/application/tools/python-2.7.2/bin/
bash-3.00# ./python
Python 2.7.2 (default, May 24 2012, 11:37:23)
[GCC 3.4.3 (csl-sol210-3_4-branch+sol_rpath)] on sunos5
Type "help", "copyright", "credits" or "license" for more information.
>>> import readline
>>> import md5   
>>>
bash-3.00#

運(yùn)行正常。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2012-09-25 07:35 |只看該作者
Python如何備份目錄及目錄下的全部?jī)?nèi)容
2011-05-17 10:04 Coder Lee Coder Lee博客 我要評(píng)論(0) 字號(hào):T | T

本來是想寫一個(gè)東西可以直接調(diào)用TortoiseSVN保存當(dāng)前代碼到一個(gè)分枝下的?上д{(diào)用SVN的部分還在研究。就先寫了目錄拷貝的部分。
AD:51CTO云計(jì)算架構(gòu)師峰會(huì) 搶票進(jìn)行中!
就目錄拷貝的部分,思想很簡(jiǎn)單。讀配置文件中的配置信息。

生成一個(gè)項(xiàng)目名稱加日期時(shí)間組成的文件夾名為分枝名稱。把當(dāng)前項(xiàng)目下的全部?jī)?nèi)容拷貝到這個(gè)目錄下。然后要做的研究就是調(diào)用TortoiseSVN命令嵌入這部分代碼。

現(xiàn)在看代碼:

1. 讀取配置文件

配置文件很簡(jiǎn)單。用的就是txt文件。 格式類似于:

# root:/Users/lichallenger/test_src/  
# project:test  
# destination:/Users/lichallenger/test_dst/
BTW: 我用的是Mac所以目錄格式是這樣的。如果你用的是Windows的話請(qǐng)適當(dāng)修改配置文件。

讀文件就是最簡(jiǎn)單的了。直接用標(biāo)準(zhǔn)庫的文件操作模塊打開文件,讀出全部的配置。一共就三行,所以也不用考慮效率什么的了。

# open config file and read config information  
# author: bruce li  

class ConfigHandler(object):  
    #  
    def __init__(self,config_path):  
        '''''initializer'''
        self.config_path = config_path  
      
    #read config infor  
    def read_config(self):  
        f = open(self.config_path)  

        try:  
            self.all_lines = f.readlines()  
        except:  
            raise      
        else:  
            f.close()  
2. 拷貝目錄和目錄內(nèi)容

拷貝目錄用了shutil模塊。里面有個(gè)方法可以直接把目錄和目錄下的全部?jī)?nèi)容拷貝到制定的其他目錄。

這樣就省得搞目錄遍歷之類的代碼了。

# copy dir(s) & file(s) to configured path  
# author: bruce li  

import shutil  

class CopyHandler(object):  
    #  
    def __init__(self,src_path,dest_path):  
        self.src_path = src_path  
        self.dest_path = dest_path  

    def move_content(self):  
        try:  
            shutil.copytree(self.src_path,self.dest_path)  
        except:  
            raise      

    @staticmethod
    def    move_src_content(src, dest):  
        try:  
            shutil.copytree(src_path,dest_path)  
        except:  
            raise
3. 綜合調(diào)用

這里用了time模塊獲取當(dāng)前時(shí)間,然后生成目標(biāo)文件夾名稱的一部分。

外界給python傳的系統(tǒng)參數(shù)的第一個(gè)是文件名。這個(gè)文件就相當(dāng)于C#項(xiàng)目里的Program文件一樣,

里面會(huì)包含一個(gè)main函數(shù)。雖然這個(gè)函數(shù)不一定要命名為main。

# main of dir copy function  
import sys  
import time  
from code_bk_cpy import *  
from code_bk_config import *  
#print __name__  
def main():  
    config_path = sys.argv[1]  
       # check if path of configuration path is empty  
    if (not config_path):  
        print 'configuration information is needed'
        return -1      
    config_handler = ConfigHandler(config_path)  
    config_handler.read_config()  
    config_list = config_handler.all_lines  
    if len(config_list) != 3:  
        print 'configuration information is not correct'
        return -1
        # set source  
    sep = ':'
    current_datetime = time.localtime(time.time())  
    root_path = config_list[0].split(sep)[1]  
    prj_name = config_list[1].split(sep)[1]  
    dst_path = config_list[2].split(sep)[1]  
    root_path = (root_path + prj_name).replace('\n','')  
    prj_folder = prj_name + str(current_datetime.tm_year) + str(current_datetime.tm_mon) + \  
str(current_datetime.tm_mday) + str(current_datetime.tm_hour) + \  
str(current_datetime.tm_min) + str(current_datetime.tm_sec)  
    dst_path = (dst_path + '/' + prj_folder + '/').replace('\n','')  
    copy_handler = CopyHandler(root_path,dst_path)  
    copy_handler.move_content()  
    print 'content moved'
# start main function  
print __name__  
if __name__ == "__main__":  
    main()
還有注意下,Python代碼的換行符為\。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2012-09-25 07:39 |只看該作者
Python 網(wǎng)站文件及數(shù)據(jù)庫備份腳本---轉(zhuǎn)

初學(xué)python,試著寫了一份python網(wǎng)站文件備份和數(shù)據(jù)庫備份的腳本,功能是寫出來了,但感覺還是不太適應(yīng),寫得不太好,以后還要努力哈!backup.py讀取backup.xml的信息,進(jìn)行相關(guān)操作,至于為啥要把信息寫在xml里,因?yàn)楦杏X用xml很酷,哈哈沒啥的,學(xué)習(xí)麻,想用就用一下哈。

backup.xml:

<?xml version="1.0"?>
<config>
        <backupdir>/backup/</backupdir>
        <dbbackup id="1">
                <host>192.168.1.100</host>
                <user>root</user>
                <passwd>123456</passwd>
                <dbname>test1</dbname>
        </dbbackup>
        <dbbackup id="2">
                <host>192.168.1.101</host>
                <user>root</user>
                <passwd>123456</passwd>
                <dbname>test2</dbname>
        </dbbackup>
        <webbackup id="1">
                <dir>/data/www</dir>
        </webbackup>
</config>
backup.py:

#!/usr/bin/env python  

from xml.dom import minidom  
import time  
import os  
import re  

dom = minidom.parse('backup.xml')  

class readxml:  
        def getText(self, node):  
                return node.childNodes[0].data  

        def getId(self, node, id):  
                return node.getAttribute(id)  

        def getGroupText(self, model):  
                dbinfo = {}  
                xml_groups = dom.getElementsByTagName(model)  
                for group in xml_groups:  
                        groupid = self.getId(group, 'id')  
                        dbinfo_one = {}  
                        for node in group.childNodes:  
                                if node.nodeType == node.ELEMENT_NODE:  
                                        dbinfo_one[node.nodeName] = self.getText(node)  
                                        dbinfo[groupid] = dbinfo_one  
                return dbinfo  

class back:  
        def webbackup(self, webgroup):  
                for i in webgroup:  
                        filename = mydate + re.sub('/', '_', webgroup.get(i).get('dir')) + ".tar.gz"
                        command = "tar zcvfp '%s' %s" % (today + os.sep + filename, webgroup.get(i).get('dir'))  
                        os.system(command)  
                          
        def dbbackup(self, dbgroup):  
                mysqlpath="/usr/local/mysql/bin/mysqldump"
                for i in dbgroup:  
                        filename = today + os.sep + mydate + "_" + dbgroup.get(i).get('dbname') + ".sql.gz"
                        command = "%s --opt -u%s -p%s -h%s %s | gzip > %s" % (mysqlpath, dbgroup.get(i).get('user'), dbgroup.get(i).get('passwd'), dbgroup.get(i).get('host'), dbgroup.get(i).get('dbname'), filename)  
                        os.system(command)  
                                      
xmlconfig = readxml()  
backupdir = xmlconfig.getText(dom.getElementsByTagName('backupdir')[0])  
dbbackup = xmlconfig.getGroupText('dbbackup')  
webbackup = xmlconfig.getGroupText('webbackup')  

mydate = time.strftime('%Y%m%d')  
today=backupdir + mydate  
if not os.path.exists(today):  
        os.makedirs(today)  

back().webbackup(webbackup)  
back().dbbackup(dbbackup)

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2012-09-25 07:42 |只看該作者
python備份文件

#雖然版本控制系統(tǒng)更強(qiáng)大,但這個(gè)腳本在開發(fā)工作中然后很有用。我常常對(duì)它進(jìn)行定制,比如只對(duì)某個(gè)特定后綴名的文件進(jìn)行備份;在for file in files 循環(huán)的內(nèi)部加一個(gè)適當(dāng)?shù)臏y(cè)試就行了。如:name, ext = os.path.splitext(file) if ext not in  ('.py', '.txt', '.doc'):continue 代碼片段首先使用標(biāo)準(zhǔn)庫模塊os.path的splitext函數(shù)來獲得文件的擴(kuò)展名(以一個(gè)句號(hào)開始),放入局部變量ext中,然后,如果文件拓展名不是我們感興趣的幾個(gè)擴(kuò)展名之一,我們就執(zhí)行continue語句,進(jìn)入下一輪循環(huán)。

import sys, os, shutil, filecmp
MAXVERSIONS = 100
def backup(tree_top, bakdir_name = 'bakdir'):
    for dir, subdirs, files in os.walk(tree_top):
        #make sure each dir has subdir called bakdir
        backup_dir = os.path.join(dir, bakdir_name)
        if not os.path.exists(backup_dir):
            os.makedirs(backup_dir)
        #stop recurse the backup dir
        subdirs[:] = [ d for d in subdirs if d != bakdir_name ]
        for file in files:
            filepath = os.path.join(dir,file)
            destpath = os.path.join(backup_dir, file)
        #check if the old version exist
            for index in xrange(MAXVERSIONS):
                backup = '%s.%2.2d' % (destpath, index)
                if not os.path.exists(backup):
                    break
            if index > 0:
            #there is no need to backup if the file is the same as the new version
                old_backup = '%s.%2.2d' %(destpath, index-1)
                abspath = os.path.abspath(filepath)
                try:
                    if os.path.isfile(old_backup) and filecmp.cmp(abspath, old_backup,shallow = False):
                        continue
                except OSError:
                    pass
            try:
                shutil.copy(filepath, backup)
            except OSError:
                pass

if __name__ == '__main__':
    #backup dir
    try:
        tree_top = sys.argv[1]
    except IndexError:
        tree_top = '.'
    backup(tree_top)

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2012-09-25 07:45 |只看該作者

1)備份源目錄的文件

2)目標(biāo)文件以tar 和bzip2的方式壓縮之后放在當(dāng)前日期文件夾下

4)備份文件以時(shí)間注釋和執(zhí)行腳本的用戶命名

3)主要用到了時(shí)間模塊,系統(tǒng)模塊,和getpass模塊

4)source 可以修改為想備份的目錄,因?yàn)閭浞菽夸浺话悴唤?jīng)常變動(dòng),所以這里寫死了



#!/bin/env python  
#告訴解釋器查找pyton解釋器并且使用它
#_*_encoding:utf8_*_  
#指定編碼為utf8編碼
import os
#導(dǎo)入系統(tǒng)模塊  
import time
#導(dǎo)入時(shí)間模塊  
import getpass
#導(dǎo)入獲取用戶模塊  
source = ['/oracle/', '/oradata/oraInventory']  
#定義備份源目錄
target_dir = '/oradata/backup/'
#定義備份目標(biāo)目錄  
user = getpass.getuser()
#定義使用備份腳本的用戶  
today = target_dir + time.strftime('%Y%m%d')
#定義今日的日期
now = time.strftime('%H%M%S')
#定義現(xiàn)在的時(shí)間  
comment = raw_input('請(qǐng)輸入一個(gè)注釋 --> ')  
#定義注釋為輸入的字符串
if len(comment) == 0:
#檢查輸入的注釋是否為空  
    target = today + now + '_' + user + '_' + 'tar.bz2'  
#如果注釋為空,備份文件的文件名為日期時(shí)間運(yùn)行腳本用戶  
else:  
    target = today +  now + '_' + comment + '_' + user + '_' + 'tar.bz2'  
#如果非空,則使用日期時(shí)間注釋用戶為文件名
if not os.path.exists(today):  
#檢查備份目錄下的時(shí)間目錄是否不存在

    os.mkdir(today)  
#如果不存在創(chuàng)建文件夾
    print '成功創(chuàng)建文件夾', today  
else:  
#存在,則打印
    print today,'文件夾已經(jīng)存在'  
time.sleep(5)
#暫停五秒  
zip_command = "tar -cjPf '%s' %s" % (target, ' '.join(source))  
#定義本備份命令

if os.system(zip_command) == 0:  
#使用系統(tǒng)環(huán)境(相當(dāng)于shell執(zhí)行備份命令,如果成功返回0)
    print ' 成功備份為:', target  
else:  
    print '備份失敗' ,target

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2012-09-25 07:52 |只看該作者
    可以將該文件(可以命名為bk)加到/your/bin之下,直接運(yùn)行bkxx既可。
        不足:該backup為第一版本,繼續(xù)改良中,后續(xù)會(huì)加上多文件支持。描述支持等。

#!/usr/bin/python
#****************AUTHOR:www.ourunix.org********************
#****************RELEASE:v1************************
#****************TIME:2011/03/25*******************
#sometimes i will copy sth by change it's name to backup.However such method can not satisfy my require.
#this python script can do the same thing and tar the file in the same time!
#happy to use it!

import sys
import os
import time

#where do you want to backup
target_dir = "/work/backup/"
#target_dir = "/work/backup/" + time.strftime(%Y%m%d)

#the filename you want to backup
today = target_dir + time.strftime('%Y%m%d')
target = today + "/" + sys.argv[1] + ".tar.gz"

#the command
tar_command = "sudo tar -czf %s %s " % (target,sys.argv[1])
print tar_command
#if len(sys.argv) == 1:
#       print "Error,no input file"
#       sys.exit()
#else:
if not os.path.exists(today):
        os.mkdir(today)
        print 'Successfully created directory', today
if os.system(tar_command) == 0:
        print "%s has backup to %s successfully!"%(sys.argv[1],target)
else:
        print sys.argv[1] ,"backup failed!"

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2012-09-25 07:56 |只看該作者
Python中應(yīng)用shell腳本
日期:2011-12-28 來源: constantina 分享至:         
  

os.chkdir(path)  轉(zhuǎn)換到目錄path 下。
os.system('md a')  可以直接創(chuàng)建目錄。
os.name字符串指示你正在使用的平臺(tái)。比如對(duì)于Windows,它是'nt',而對(duì)于Linux/Unix用戶,它是'posix'。
● os.getcwd()函數(shù)得到當(dāng)前工作目錄,即當(dāng)前Python腳本工作的目錄路徑。
● os.getenv()和os.putenv()函數(shù)分別用來讀取和設(shè)置環(huán)境變量。
● os.listdir()返回指定目錄下的所有文件和目錄名。
● os.remove()函數(shù)用來刪除一個(gè)文件。
● os.system()函數(shù)用來運(yùn)行shell命令。
● os.linesep字符串給出當(dāng)前平臺(tái)使用的行終止符。例如,Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'。
● os.path.split()函數(shù)返回一個(gè)路徑的目錄名和文件名。
>>> os.path.split('/home/swaroop/byte/code/poem.txt')
('/home/swaroop/byte/code', 'poem.txt')
● os.path.isfile()和os.path.isdir()函數(shù)分別檢驗(yàn)給出的路徑是一個(gè)文件還是目錄。類似地,os.path.exists()函數(shù)用來檢驗(yàn)給出的路徑是否真地存在。
文件重定向
       已有PY文件new1.py ,在命令行下輸入:new1>new.txt 可以將new1運(yùn)行的結(jié)果輸出到文件new.txt,這稱為流重定向。


python可以做shell腳本嗎? 首先介紹一個(gè)函數(shù):
os.system(command)
這個(gè)函數(shù)可以調(diào)用shell運(yùn)行命令行command并且返回它的返回值。試一下在python的解釋器里輸入os.system(”ls -l”),就可以看到”ls”列出了當(dāng)前目錄下的文件。可以說,通過這個(gè)函數(shù),python就擁有了shell的所有能力。呵呵。。不過,通常這條命令不 需要用到。因?yàn)閟hell常用的那些命令在python中通常有對(duì)應(yīng)而且同樣簡(jiǎn)潔的寫法。
shell中最常用的是ls命令,python對(duì)應(yīng)的寫法是:os.listdir(dirname),這個(gè)函數(shù)返回字符串列表,里面是所有的文件名,不過不包含”.”和”..”。如果要遍歷整個(gè)目錄的話就會(huì)比較復(fù)雜一點(diǎn)。我們等下再說吧。先在解釋器里試一下:
>>> os.listdir(”/”)
[’tmp’, ‘misc’, ‘opt’, ‘root’, ‘.autorelabel’, ’sbin’, ’srv’, ‘.autofsck’, ‘mnt’, ‘usr’, ‘var’, ‘etc’, ’selinux’, ‘lib’, ‘net’, ‘lost+found’, ’sys’, ‘media’, ‘dev’, ‘proc’, ‘boot’, ‘home’, ‘bin’]
就像這樣,接下去所有命令都可以在python的解釋器里直接運(yùn)行觀看結(jié)果。
對(duì)應(yīng)于cp命令的是:shutil.copy(src,dest),這個(gè)函數(shù)有兩個(gè)參數(shù),參數(shù)src是指源文件的名字,參數(shù)dest則是目標(biāo)文件或 者目標(biāo)目錄的名字。 如果dest是一個(gè)目錄名,就會(huì)在那個(gè)目錄下創(chuàng)建一個(gè)相同名字的文件。與shutil.copy函數(shù)相類似的是 shutil.copy2(src,dest),不過copy2還會(huì)復(fù)制最后存取時(shí)間和最后更新時(shí)間。
不過,shell的cp命令還可以復(fù)制目錄,python的shutil.copy卻不行,第一個(gè)參數(shù)只能是一個(gè)文件。這怎么辦?其 實(shí),python還有個(gè)shutil.copytree(src,dst[,symlinks]) 。參數(shù)多了一個(gè)symlinks,它是一個(gè)布爾值,如果是True的話就創(chuàng)建符號(hào)鏈接。
移動(dòng)或者重命名文件和目錄呢?估計(jì)被聰明的朋友猜到了,shutil.move(src,dst),呵呵。。與mv命令類似,如果src和dst在 同一個(gè)文件系統(tǒng)上,shutil.move只是簡(jiǎn)單改一下名字,如果src和dst在不同的文件系統(tǒng)上,shutil.move會(huì)先把src復(fù)制到 dst,然后刪除src文件?吹浆F(xiàn)在,大多數(shù)朋友應(yīng)該已經(jīng)對(duì)python的能力有點(diǎn)眉目了,接下來我就列個(gè)表,介紹一下其它的函數(shù):
os.chdir(dirname)
把當(dāng)前工作目錄切換到dirname下
os.getcwd()
返回當(dāng)前的工作目錄路徑
os.chroot(dirname)
把dirname作為進(jìn)程的根目錄。和*nix下的chroot命令類似
os.chmod(path,mode)
更改path的權(quán)限位。mode可以是以下值(使用or)的組合:
os.S_ISUID
os.S_ISGID
os.S_ENFMT
os.S_ISVTX
os.S_IREAD
os.S_IWRITE
os.S_IEXEC
os.S_IRWXU
os.S_IRUSR
os.S_IWUSR
os.S_IXUSR
os.S_IRWXG
os.S_IRGRP
os.S_IWGRP
os.S_IXGRP
os.S_IRWXO
os.S_IROTH
os.S_IWOTH
os.S_IXOTH
具體它們是什么含義,就不仔細(xì)說了,基本上就是R代表讀,W代表寫,X代表執(zhí)行權(quán)限。USR代表用戶,GRP代表組,OTH代表其它。
os.chown(path,uid,gid)
改變文件的屬主。uid和gid為-1的時(shí)候不改變?cè)瓉淼膶僦鳌?br /> os.link(src,dst)
創(chuàng)建硬連接
os.mkdir(path,[mode])
創(chuàng)建目錄。mode的意義參見os.chmod(),默認(rèn)是0777
os.makedirs(path,[mode])
和os.mkdir()類似,不過會(huì)先創(chuàng)建不存在的父目錄。
os.readlink(path)
返回path這個(gè)符號(hào)鏈接所指向的路徑
os.remove(path)
刪除文件,不能用于刪除目錄
os.rmdir(path)
刪除文件夾,不能用于刪除文件
removedirs(path)
遞歸移除目錄。類似于rmdir()的工作,除了如果子目錄被成功地刪除,removedirs()嘗試接連地刪除每個(gè)在path中提及的父目錄,直到一個(gè)錯(cuò)誤被掛起(這個(gè)錯(cuò)誤被忽略,因?yàn)樗ǔR馕陡改夸洸粸榭。)例如?quot;os.removedirs(‘foo/bar/baz')"將首先刪除"'foo/bar/baz'"目錄,然后如果 "'foo/bar'"和"'foo'"為空刪除它們。如果子目錄不能被成功地刪除掛起OSError。1.5.2版本中的新方法。

rename(src, dst)
重命名文件或目錄src為dst。如果dst是一個(gè)目錄,OSError將被掛起。在Unix上,如果dst存在并且是一個(gè)文件,如果用戶有權(quán)限它將被默默地刪除。在一些Unix風(fēng)格的系統(tǒng)上如果src和dst是不同的文件系統(tǒng),這個(gè)操作可能失敗。如果成功,重命名將是一個(gè)基本的操作(這是一個(gè)POSIX要求)。在Windows上,如果dst已經(jīng)存在,甚至如果它是一個(gè)文件,OSError將被掛起;當(dāng)dst命名一個(gè)已存在的文件時(shí)沒有辦法執(zhí)行基本的重命名。

renames(old, new)
遞歸重命名目錄或文件函數(shù)。類似于rename()的工作,除了所有中間層目錄的創(chuàng)建第一次試圖需要有效的新的路徑名。重命名后,目錄符合老的名稱最右邊路徑部分將被用removedirs()刪除。1.5.2版本中的新方法。

注意:如果你缺乏需要?jiǎng)h除子目錄或文件的權(quán)限,使用新的目錄結(jié)構(gòu)重命名時(shí)這個(gè)函數(shù)會(huì)失敗。
readlink(path)
返回一個(gè)代表符號(hào)連接點(diǎn)指向的路徑的字符串。結(jié)果可以是絕對(duì)或相對(duì)路徑名的其中之一;如果是相對(duì),它可以用os.path.join(os.path.dirname(path), result)轉(zhuǎn)換成一個(gè)絕對(duì)路徑?捎茫篗acintosh, Unix。

stat(path)
在給定的路徑上執(zhí)行stat()系統(tǒng)調(diào)用。返回值是一個(gè)對(duì)象,它的屬性對(duì)應(yīng)stat的結(jié)構(gòu)數(shù),即:st_mode(保護(hù)塊),st_ino(索引節(jié)點(diǎn)數(shù)), st_dev(設(shè)備),st_nlink(硬連接數(shù)),st_uid(所有者的用戶ID),st_gid(所有者的組ID),st_size(文件大小,用字節(jié)),st_atime(當(dāng)前訪問的時(shí)間),st_mtime(當(dāng)前內(nèi)容修改的時(shí)間),st_ctime(平臺(tái)依賴,在Unix上當(dāng)前元數(shù)據(jù)改變的時(shí)間,在Windows上創(chuàng)建的時(shí)間):

>>> import os

>>> statinfo = os.stat('somefile.txt')

>>> statinfo

(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)

>>> statinfo.st_size

926L
os.symlink(src,dst)
創(chuàng)建符號(hào)鏈接
tempnam([dir[, prefix]])
為創(chuàng)建一個(gè)臨時(shí)文件合理的返回一個(gè)唯一的路徑名。這將是一個(gè)絕對(duì)路徑路徑,以dir目錄中可能的目錄項(xiàng)命名,或是一個(gè)通常的臨時(shí)文件的位置,如果dir被忽略或?yàn)镹one。如果給定和不為None,prefix被用來給文件名提供一個(gè)簡(jiǎn)短的前綴。應(yīng)用負(fù)責(zé)使用由tempnam()返回的路徑恰當(dāng)?shù)貏?chuàng)建和管理文件;不提供自動(dòng)清除。在Unix上,環(huán)境變量TMPDIR覆蓋dir,在Windows上TMP被使用。這個(gè)函數(shù)的指定行為依賴于C庫的執(zhí)行;some aspects are underspecified in system documentation.注意:tempnam()的用法是危險(xiǎn)的對(duì)于符號(hào)連接攻擊;考慮用tmpfile()(14.1.2節(jié))替代?捎茫 Macintosh, Unix, Windows。

tmpnam()
為創(chuàng)建一個(gè)臨時(shí)文件合理的返回一個(gè)唯一的路徑名。這將是一個(gè)絕對(duì)路徑路徑,以一個(gè)通常的臨時(shí)文件的位置中可能的目錄項(xiàng)命名,應(yīng)用負(fù)責(zé)使用由tempnam ()返回的路徑恰當(dāng)?shù)貏?chuàng)建和管理文件;不提供自動(dòng)清除。注意:tempnam()的用法是危險(xiǎn)的對(duì)于符號(hào)連接攻擊;考慮用tmpfile() (14.1.2節(jié))替代?捎茫篗acintosh, Unix, Windows。這個(gè)函數(shù)大概在Windows上不被使用,不過:微軟tmpnam()的實(shí)現(xiàn)一直創(chuàng)建在當(dāng)前驅(qū)動(dòng)的根目錄中創(chuàng)建一個(gè)名字,它通常是一個(gè)臨時(shí)文件粗略的位置(依賴于特權(quán),你甚至用這個(gè)名稱不能打開一個(gè)文件)。

TMP_MAX
再使用這些名稱之前tmpnam()將生成的唯一的名稱的最大數(shù)目。

unlink(path)
刪除文件path。同remove()相同;unlink()名稱是它的傳統(tǒng)的Unix名稱?捎茫篗acintosh, Unix, Windows。

utime(path, times)
設(shè)置由path指定的文件的訪問和date.html' target='_blank'>修改時(shí)間。如果times是None,那么文件的訪問和修改時(shí)間被設(shè)置為當(dāng)前的時(shí)間。否則,times必須是一個(gè)二元組數(shù),它的被用來設(shè)置訪問和修改時(shí)間的格式分別是(atime, mtime)。目錄能否由path指定依賴于操作系統(tǒng)是否作為一個(gè)文件執(zhí)行目錄(如,Windows就不是)。注意你這兒設(shè)置的精確的時(shí)間不能通過后來的 stat()調(diào)用返回,依賴于正式的你的操作系統(tǒng)紀(jì)錄的訪問和修改時(shí)間;參見stat()。2.0版本中的改變:增加times為None的支持。可用: Macintosh, Unix, Windows。

walk(top[, topdown=True [, onerror=None]]),它os.listdir()明顯的區(qū)別就是,它能進(jìn)行縱深遍歷,os.listdir()只能遍歷當(dāng)前目錄里的所有子目錄和文件。
在目錄樹中walk()生成文件名,通過由上而下或右下而上遍歷樹。這個(gè)樹中每個(gè)目錄的根在目錄top(包含top自身),它給出一個(gè)三元組(dirpath, dirnames, filenames)。

dirpath 是一個(gè)目錄的路徑字符串。dirnames是一個(gè)dirpath的子目錄的名稱的列表(排除'.'和'..')。filenames是一個(gè)dirpath 中沒有目錄的文件的名稱的列表。注意列表中的名稱包含無路徑的組件。獲取dirpath中文件和目錄的完整路徑(以top開始),用 os.path.join(dirpath, name)。

如果可選參數(shù)topdown為true或沒有指定,它的子目錄三倍生成之前三倍的目錄被生成(目錄的生成從上而下)。如果topdown為false,三倍的目錄被生成在它的子目錄三倍生成之后(目錄生成由下而上)。

當(dāng)topdown 為true,調(diào)用者能修改dirnames列表的原狀(可能用del或slice任務(wù)),walk()僅將遞歸名稱仍然在dirnames中的子目錄;這能被用來刪除查找,利用指定的順序訪問,或者重新walk()之前告訴walk()關(guān)于調(diào)用者創(chuàng)建或重命名的目錄。當(dāng)topdown為false時(shí)修改 dirnames是無效的,因?yàn)樵谧缘紫蛏系哪J街衐irnames中的目錄在dirpath生成之前被生成。

os.listdir()調(diào)用缺省的錯(cuò)誤被忽略。如果可選參數(shù)onerror被指定,它應(yīng)該是一個(gè)函數(shù);它將被調(diào)用用一個(gè)參數(shù),一個(gè)OSError實(shí)例。它能用walk繼續(xù)報(bào)告錯(cuò)誤,或忽略walk掛起異常。注意文件名是可用的作為異常對(duì)象的文件名屬性。

注意:如果你傳遞一個(gè)相對(duì)的路徑名,在重新開始和walk()之間不改變當(dāng)前的工作目錄。walk()從不改變當(dāng)前的目錄,并且假定它的調(diào)用者也不改變。

注意:在支持符號(hào)連接的系統(tǒng)上,連接到出現(xiàn)在dirnames列表中的子目錄,但是walk()將不訪問它們(當(dāng)跟隨符號(hào)連接時(shí)避免無窮大的循環(huán)是困難的)。訪問連接的目錄,你能用os.path.islink(path)來識(shí)別它們,并且各自直接調(diào)用walk(path)。

這個(gè)例子顯示開始目錄下的每個(gè)目錄中非目錄的文件的字節(jié)數(shù),除了不查找任意CVS子目錄下的:

import os

from os.path import join, getsize

for root, dirs, files in os.walk('python/Lib/email'):

    print root, "consumes",

    print sum(getsize(join(root, name)) for name in files),

    print "bytes in", len(files), "non-directory files"

    if 'CVS' in dirs:

        dirs.remove('CVS')  # don't visit CVS directories

下面的例子中,從下到上遍歷樹等于:rmdir()目錄為空之前不允許刪除目錄:

# Delete everything reachable from the directory named in 'top',

# assuming there are no symbolic links.

# CAUTION:  This is dangerous!  For example, if top == '/', it

# could delete all your disk files.

import os

for root, dirs, files in os.walk(top, topdown=False):

    for name in files:

        os.remove(os.path.join(root, name))

    for name in dirs:

        os.rmdir(os.path.join(root, name))

New in version 2.3.
shutil.rmtree(path[,ignore_errors[,onerror]])
刪除文件夾
介紹了這么多,其實(shí)只要查一下os和shutil兩個(gè)模塊的文檔就有了,呵呵。。真正編寫shell腳本的時(shí)候還需要注意:
1.環(huán)境變量。python的環(huán)境變量保存在os.environ這個(gè)字典里,可以用普通字典的方法修改它,使用system啟動(dòng)其它程序的時(shí)候會(huì)自動(dòng)被繼承。比如:
os.environ[”fish”]=”nothing”
不過也要注意,環(huán)境變量的值只能是字符串。和shell有些不同的是,python沒有export環(huán)境變量這個(gè)概念。為什么沒有呢?因?yàn)閜ython沒有必要有
2.os.path這個(gè)模塊里包含了很多關(guān)于路徑名處理的函數(shù)。在shell里路徑名處理好像不是很重要,但是在python里經(jīng)常需要用到。最常用的兩個(gè)是分離和合并目錄名和文件名:
os.path.split(path) -> (dirname,basename)
這個(gè)函數(shù)會(huì)把一個(gè)路徑分離為兩部分,比如:os.path.split(”/foo/bar.dat”)會(huì)返回(”/foo”,”bar.dat”)
os.path.join(dirname,basename)
這個(gè)函數(shù)會(huì)把目錄名和文件名組合成一個(gè)完整的路徑名,比如:os.path.join(”/foo”,”bar.dat”)會(huì)返回”/foo /bar.dat”。這個(gè)函數(shù)和os.path.split()剛好相反。
還有這些函數(shù):
os.path.commonprefix(list)
返回list中,所有path共有的最長(zhǎng)的路徑。
如:
>>> os.path.commonprefix(['/home/td','/home/td/ff','/home/td/fff'])
'/home/td'
os.path.lexists(path)
與os.path.exists(path)的不同是如果有損壞的鏈接會(huì)返回True
os.path.basename('/foo/bar.dat')
>>>bar.dat
os.path.dirname('/foo/bar.dat')
>>>/foo
os.path.realpath(path)
返回path的真實(shí)路徑,去除符號(hào)鏈接
os.path.relpath(path[, start])
返回一個(gè)“相關(guān)路徑”,當(dāng)前目錄或者可選的start
Return a relative filepath to path either from the current directory or from an optional start point.
如:
>>> os.path.relpath('/home/jimin','/usr/lib/')
'http://www.cnblogs.com/home/jimin'
os.path.samefile(path1, path2)
如果path1與path2是相同的文件或目錄,返回真
os.path.sameopenfile(fp1, fp2)
如果fp1和fp2指向的是同一個(gè)文件,返回True
os.path.samestat(stat1, stat2)
如果 stat tuple stat1和stat2指向同一個(gè)文件,返回真。stat tuple結(jié)構(gòu)是由fstat()、lstat()、stat()產(chǎn)生的
os.path.abspath(path)
把path轉(zhuǎn)成絕對(duì)路徑,相當(dāng)于normpath(join(os.getcwd(), path))
os.path.expanduser(path)
把path中包含的”~”和”~user”轉(zhuǎn)換成用戶目錄
os.path.expandvars(path)
接受環(huán)境變理的擴(kuò)展,path中可以使用環(huán)境變量
如:
>>> os.path.expandvars('$PATH')
'/usr/lib64/qt-3.3/bin:/usr/kerberos/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local         
/sbin:/usr/sbin:/sbin:/home/jimin/bin'
>>> os.path.expandvars('$HOME')
'/home/jimin'
os.path.expandvars(path)
根據(jù)環(huán)境變量的值替換path中包含的”$name”和”${name}”,比如環(huán)境變量FISH=nothing,那 os.path.expandvars(”$FISH/abc”)會(huì)返回”nothing/abc”
os.path.normpath(path)
去掉path中包含的”.”和”..”
os.path.splitext(path)
把path分離成基本名和擴(kuò)展名。比如:os.path.splitext(”/foo/bar.tar.bz2″)返回(’/foo /bar.tar’, ‘.bz2′)。要注意它和os.path.split()的區(qū)別
3.在os模塊有一個(gè)很好用的函數(shù)叫os.stat()沒有介紹,因?yàn)閛s.path模塊里包含了一組和它具有同樣功能的函數(shù),但是名字更好記一點(diǎn)。
os.path.exists(path)
判斷文件或者目錄是否存在
os.path.isfile(path)
判斷path所指向的是否是一個(gè)普通文件,而不是目錄
os.path.isdir(path)
判斷path所指向的是否是一個(gè)目錄,而不是普通文件
os.path.islink(path)
判斷path所指向的是否是一個(gè)符號(hào)鏈接
os.path.ismount(path)
判斷path所指向的是否是一個(gè)掛接點(diǎn)(mount point)
os.path.getatime(path)
返回path所指向的文件或者目錄的最后存取時(shí)間。
os.path.getmtime(path)
返回path所指向的文件或者目錄的最后修改時(shí)間
os.path.getctime(path)
返回path所指向的文件的創(chuàng)建時(shí)間
os.path.getsize(path)
返回path所指向的文件的大小
4.應(yīng)用python編寫shell腳本經(jīng)常要用到os,shutil,glob(正則表達(dá)式的文件名),tempfile(臨時(shí)文 件),pwd(操作/etc/passwd文件),grp(操作/etc/group文件),commands(取得一個(gè)命令的輸出)。前面兩個(gè)已經(jīng)基本 上介紹完了,后面幾個(gè)很簡(jiǎn)單,看一下文檔就可以了。
5.sys.argv是一個(gè)列表,保存了python程序的命令行參數(shù)。其中sys.argv[0]是程序本身的名字。
不能光說不練,接下來我們就編寫一個(gè)用于復(fù)制文件的簡(jiǎn)單腳本。前兩天叫我寫腳本的同事有個(gè)幾萬個(gè)文件的目錄,他想復(fù)制這些文件到其它的目錄,又不能 直接復(fù)制目錄本身。他試了一下”cp src/* dest/”結(jié)果報(bào)了一個(gè)命令行太長(zhǎng)的錯(cuò)誤,讓我?guī)退麑懸粋(gè)腳本。操起python來:
import sys,os.path,shutil
for f in os.listdir(sys.argv[1]):
shutil.copy(os.path.join(sys.argv[1],f),sys.argv[2])
再試一下linuxapp版里的帖子——把一個(gè)文件夾下的所有文件重命名成10001~10999?梢赃@樣寫:
import os.path,sys
dirname=sys.argv[1]
i=10001
for f in os.listdir(dirname):
src=os.path.join(dirname,f)
if os.path.isdir(src):
continue
os.rename(src,str(i))
i+=1http://www.linuxso.com/shell/14938.html
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP