生活随笔
收集整理的這篇文章主要介紹了
Python import以及os模块
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉自:http://jianpx.iteye.com/blog/486466
http://blog.chinaunix.net/uid-27838438-id-4087978.html
Import:
1. import 實際上是python虛擬機把當前的globals()和locals()傳進__builtins__.__import__內置函數了,所以實際上干活的是那個__import__函數!
?
2. import對命名空間的影響
1)如果是python的內置模塊,例如os模塊。這些模塊是隨著python虛擬機啟動而加載進來的,但是并沒有暴露出來。我們可以通過dir()命令查看當前命名空間
Python代碼??
>>>?dir()?? ['__builtins__',?'__doc__',?'__name__']??
?可以看到,并沒有看到像os,sys等模塊。
但是我們如果執行import sys后,那就有了。
Python代碼??
>>>?import?sys?? >>>?dir()?? ['__builtins__',?'__doc__',?'__name__',?'sys']??
?通過sys.modules這個字典(key: 模塊名;value: 模塊的路徑),我們可以查看模塊的信息。再通過id函數,我們可以知道兩個sys模塊是否為同一個模塊,如下:
Python代碼??
>>>?id(sys)?? 135708788?? >>>?id(sys.modules['sys'])?? 135708788??
?
2)import只影響當前模塊的命名空間
例如a.py里面有一句import bb,? 而bb.py里面有一句import os,那么可以這樣查看
Python代碼??
>>>?import?a?? >>>?dir()?? ['__builtins__',?'__doc__',?'__name__',?'a']?? >>>?dir(a)?? ['__builtins__',?'__doc__',?'__file__',?'__name__',?'bb']?? >>>?dir(a.bb)?? ['__builtins__',?'__doc__',?'__file__',?'__name__',?'os']??
?
3. import package
首先合法的package必須含有一個__init__.py文件,package可以包含0個或多個module(py文件)。假設aa文件夾中有test.py文件和bb文件夾,bb文件夾里面有c.py。那么當import aa.bb.c的時候,究竟對命名空間產生什么影響呢?
Python代碼??
>>>?import?aa.bb.c?? >>>?dir()?? ['__builtins__',?'__doc__',?'__name__',?'aa']?? >>>?import?sys??? >>>?for?k,v?in?sys.modules.items():?? ...?????print?k,'\t',v?? ...??? <span?style="color:?#ff0000;">aa????<module?'aa'?from?'aa/__init__.pyc'></span>?? ?? ?? ?? copy_reg????<module?'copy_reg'?from?'/usr/local/lib/python2.5/copy_reg.pyc'>?? __main__????<module?'__main__'?(built-in)>?? site????<module?'site'?from?'/usr/local/lib/python2.5/site.pyc'>?? __builtin__?????<module?'__builtin__'?(built-in)>?? encodings???<module?'encodings'?from?'/usr/local/lib/python2.5/encodings/__init__.pyc'>?? encodings.encodings?????None?? <span?style="color:?#ff0000;">aa.bb.c???<module?'aa.bb.c'?from?'aa/bb/c.pyc'></span>?? ?? ?? ?? posixpath???<module?'posixpath'?from?'/usr/local/lib/python2.5/posixpath.pyc'>?? errno???<module?'errno'?(built-in)>?? encodings.codecs????None?? encodings.latin_1???<module?'encodings.latin_1'?from?'/usr/local/lib/python2.5/encodings/latin_1.pyc'>?? os.path?????<module?'posixpath'?from?'/usr/local/lib/python2.5/posixpath.pyc'>?? _codecs?????<module?'_codecs'?(built-in)>?? stat????<module?'stat'?from?'/usr/local/lib/python2.5/stat.pyc'>?? zipimport???<module?'zipimport'?(built-in)>?? warnings????<module?'warnings'?from?'/usr/local/lib/python2.5/warnings.pyc'>?? encodings.types?????None?? UserDict????<module?'UserDict'?from?'/usr/local/lib/python2.5/UserDict.pyc'>?? sys?????<module?'sys'?(built-in)>?? codecs??<module?'codecs'?from?'/usr/local/lib/python2.5/codecs.pyc'>?? readline????<module?'readline'?from?'/usr/local/lib/python2.5/lib-dynload/readline.so'>?? types???<module?'types'?from?'/usr/local/lib/python2.5/types.pyc'>?? _types??<module?'_types'?(built-in)>?? signal??<module?'signal'?(built-in)>?? linecache???<module?'linecache'?from?'/usr/local/lib/python2.5/linecache.pyc'>?? posix???<module?'posix'?(built-in)>?? encodings.aliases???<module?'encodings.aliases'?from?'/usr/local/lib/python2.5/encodings/aliases.pyc'>?? <span?style="color:?#ff0000;">aa.bb?????<module?'aa.bb'?from?'aa/bb/__init__.pyc'></span>?? ?? ?? ?? exceptions??<module?'exceptions'?(built-in)>?? os??<module?'os'?from?'/usr/local/lib/python2.5/os.pyc'>??
?
可以看到只是一句import aa.bb.c,卻把aa,aa.bb,aabb.c全部加入了當前命名空間。這種做法是為了防止重名的吧,因為如果不加前綴的話,其他包里面有重名的模塊就不能識別了!原理是python現在當前命名空間查找符號‘aa’對應的object,然后再在它的命名空間查找符號'bb',然后在bb的屬性(命名空間)里面尋找c,所以,需要把aa,bb都加載進來。不過這些都是只加載一次的,不信的話,大家可以試一下再import aa.bb.d這樣的模塊,同時預先在aa文件夾中的
__init__.py文件中輸入print ‘hello’,hello只在第一次import aa.bb.c的時候輸出!
?
4.from與import
1)例如:from aa import bb
Python代碼??
>>>?from?aa?import?bb?? >>>?dir()?? ['__builtins__',?'__doc__',?'__name__',?'bb']?? >>>?import?sys??? >>>?sys.modules['bb']?? Traceback?(most?recent?call?last):?? ??File?"<stdin>",?line?1,?in?<module>?? KeyError:?'bb'?? >>>?sys.modules['aa.bb']?? <module?'aa.bb'?from?'aa/bb/__init__.pyc'>?? >>>?bb?? <module?'aa.bb'?from?'aa/bb/__init__.pyc'>?? >>>?aa.bb?? Traceback?(most?recent?call?last):?? ??File?"<stdin>",?line?1,?in?<module>?? NameError:?name?'aa'?is?not?defined??
?from import只是把import后面的名字引入了命名空間,讓我們可以更方便的 使用而已,但是內部實際上還是帶有模塊名的。import 。。。as。。。也是同樣的道理了。
?
2)from 。。。import *
這種形式的import是不推薦的,因為很容易污染命名空間。但是也可以了解一下。
首先如果package中的__init__.py文件并沒有聲明__all__ 的值的話,from package import * 是沒有用的。因為python源碼中的import_from_all這個函數估計會去讀__all__的值,然后再import。
而這種形式的import對命名空間的影響又是怎樣的呢?
?答案是和import aa.bb.c那種一樣的。
os模塊:
使用環境64位的fedora?18,python版本是python?2.7.3
1、os.getcwd()函數
????功能:獲取當前目錄,python?的工作目
import?os
??????????????????????????????????????????????????????????????????
pwd?=?os.getcwd()
??????????????????????????????????????????????????????????????????
print?(pwd)
2、os.name?函數
????功能:獲取當前使用的操作系統(獲取信息不夠詳細)
??????????????其中?'nt'?是?windows,'posix'?是?linux?或者?unix
import?os
?????????????????????????????????????????????????????????????
name?=?os.name
?????????????????????????????????????????????????????????????
if?name?==?'posix':
?????????????????????????????????????????????????????????????????
????print?("this is Linux or Unix")
?????????????????????????????????????????????????????????????
elif?name?==?'nt':
?????????????????????????????????????????????????????????????
?print?("this is windows")
?????????????????????????????????????????????????????????????
else:
?????????????????????????????????????????????????????????????
?print?("this is other system")
3、os.remove()函數
????功能:刪除指定文件
????eg:刪除?file.txt?文件
import?os
??????????????????????????????????????????????????
os.remove(’file.txt‘)
4、os.removedirs()函數
????功能:刪除指定目錄
????eg:刪除?file目錄
import?os
????????????????????????????????????????????????
os.removedirs(‘file’)
5、os.system()函數
????功能:運行shell命令
????eg:執行ls?-a?>?1.txt命令
import?os
???????????????????????????????????????????
os.system(‘ls?-a?>?1.txt’)
6、os.mkdir()函數
????功能:創建一個新目錄
????eg:創建一個?file?目錄
import?os
?????????????????????????????????
os.mkdir(‘file’)
7、os.chdir()函數
????功能:改變當前路徑到指定路徑
????eg:我現在從當前路徑到?filepath?所指定的路徑下
import?os
??????????????????????
filepath?=?'/home'
??????????????????????
pwd?=?os.getcwd()
??????????????????????
print?(pwd)
??????????????????????
os.chdir(filepath)
??????????????????????
pwd?=?os.getcwd()
??????????????????????
print?(pwd)
8、os.listdir()函數
????功能:返回指定目錄下的所有目錄和文件
????eg:列出當前目錄下的所有文件和目錄
import?os
?????????????
pwd?=?os.getcwd()
?????????????
name?=?os.listdir(pwd)
?????????????
for?filename?in?name:
?????????????
????print?(filename)
總結
以上是生活随笔為你收集整理的Python import以及os模块的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。