1. 程式人生 > >python模塊之os_sys_動態導入_包

python模塊之os_sys_動態導入_包

代碼 pen python3 遞歸 被調用 cal false each gis

#!/usr/bin/env python
# coding:utf-8

import os


print(os.getcwd())  #獲取當前工作目錄,即當前python腳本工作的目錄路徑
# os.chdir("dirname")  #改變當前腳本工作目錄;相當於shell下cd
print(os.curdir)  # 返回當前目錄: (‘.‘) 所以一個點也是代表當前目錄的意思
print(os.pardir)  # 獲取當前目錄的父目錄字符串名:(‘..‘)

# print(os.makedirs(‘dirname1/dirname2‘))  #  可生成多層遞歸目錄
# print(os.removedirs(‘dirname1/dirname2‘))  #  若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推

# os.mkdir(‘dirname‘)    生成單級目錄;相當於shell中mkdir dirname
# os.rmdir(‘dirname‘)    刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname

print(os.listdir(‘./web‘)) #   列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式打印 不會遞歸
# os.remove()  刪除一個文件
# os.rename("oldname","newname")  重命名文件/目錄
# os.stat(‘path/filename‘)  獲取文件/目錄信息
# os.sep    輸出操作系統特定的路徑分隔符,win下為"\\",Linux下為"/"
# os.linesep    輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"
# os.pathsep    輸出用於分割文件路徑的字符串 win下為;,Linux下為:
# os.name    輸出字符串指示當前使用平臺。win->‘nt‘; Linux->‘posix‘
# os.system("bash command")  運行shell命令,直接顯示
# os.environ  獲取系統環境變量
# os.path.abspath(path)  返回path規範化的絕對路徑
# os.path.split(path)  將path分割成目錄和文件名二元組返回

a = os.path.dirname(r"D:\Python3\14 module\os_test.py")
b = os.path.basename("D:/Python3/14 module/os_test.py")
print(a) #  返回path的目錄。其實就是os.path.split(path)的第一個元素
print(b)  #返回path最後的文件名。如果path以/或\結尾,那麽就會返回空值。即os.path.split(path)的第二個元素

# os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
# os.path.isabs(path)  如果path是絕對路徑,返回True
# os.path.isfile(path)  如果path是一個存在的文件,返回True。否則返回False
# os.path.isdir(path)  如果path是一個存在的目錄,則返回True。否則返回False
# os.path.join(path1[, path2[, ...]])  將多個路徑組合後返回,第一個絕對路徑之前的參數將被忽略

c = os.path.join(a,b) # 路徑拼接會自動在裏面加上反斜杠 print(‘----------->‘,c)
# os.path.getatime(path)  返回path所指向的文件或者目錄的最後存取時間
# os.path.getmtime(path)  返回path所指向的文件或者目錄的最後修改時間

if __name__ == "__main__":
    print(os.path.getmtime(__file__))
    print(__file__)
技術分享圖片

os小例子:

技術分享圖片
#!/usr/bin/env python
# coding:utf-8

import os
import os.path
"""獲取指定目錄及其子目錄下的 py 文件路徑。說明:lis 用於存儲找到的 py 文件路徑。 get_py 函數,遞歸查找並存儲 py 文件路徑到 lis 中 """
lis = []
def get_py(path,lis):
    fileList = os.listdir(path)   #獲取path目錄下文件
    for filename in fileList:
        pathTmp = os.path.join(path,filename)   #獲取path與filename組合後的路徑
        if os.path.isdir(pathTmp):   #如果是目錄
            get_py(pathTmp,lis)        #則遞歸查找
        elif filename[-3:].upper()==‘.PY‘:   #不是目錄,則比較後綴名
            lis.append(pathTmp)
path = input(‘請輸入路徑:‘).strip()
get_py(path,lis)
print(‘在%s目錄及其子目錄下找到%d個py文件\n分別為:\n‘%(path,len(lis)))
for filepath in lis:
    print(filepath+‘\n‘)
技術分享圖片

os小例子:查找某些文件

技術分享圖片
#!/usr/bin/env python
# coding:utf-8

import os

## 查找某些文件 
def search_file(start_dir, target):
    os.chdir(start_dir)

    for each_file in os.listdir(os.curdir):
        ext = os.path.splitext(each_file)[1]
        if ext in target:
            vedio_list.append(os.getcwd() + os.sep + each_file + os.linesep)
        if os.path.isdir(each_file):
            search_file(each_file, target)  # 遞歸調用
            os.chdir(os.pardir)  # 遞歸調用後切記返回上一層目錄


start_dir = input(‘請輸入待查找的初始目錄:‘)
program_dir = os.getcwd()

target = [‘.mp4‘, ‘.avi‘, ‘.rmvb‘] # 指定文件類型
vedio_list = []

search_file(start_dir, target)

f = open(program_dir + os.sep + ‘vedioList.txt‘, ‘w‘)
f.writelines(vedio_list)
f.close()
技術分享圖片

sys 模塊

技術分享圖片
#!/usr/bin/env python
# coding:utf-8

import sys

print(sys.argv) # 使用命令行運行此腳本時可接受傳入參數 例如: python3 sys_test.py abc ddd fff

# cmd = sys.argv[1]
# path = sys.argv[2]
#
# if cmd =="post":
#     pass
# elif cmd =="get":
#     pass


import  time
# 簡單模擬進度條
for i in range(100):
    sys.stdout.write("#")
    time.sleep(0.1)
    sys.stdout.flush()
    
    
## 更多參考: http://www.cnblogs.com/cherishry/p/5725184.html
技術分享圖片

一個模塊導入時路徑的問題:

當前目錄有bin.py文件和my_mod文件夾,my_mod文件夾下有ma.py和cal.py文件。

而os和sys正好用來解決my_mod/ma.py導入cal模塊, 以及被bin.py導入的路徑問題

技術分享圖片
#!/usr/bin/env python
# coding:utf-8
# cal.py

# print(‘before...‘)

def add(x,y):
    return x+y


def sub(x,y):
    return x-y

# print(‘end....‘)
if __name__ == "__main__": # 用於本文件的調試
    print(‘testing....‘)


print(__name__) # 被調用時將打印出文件名(模塊名)
技術分享圖片 技術分享圖片
#!/usr/bin/env python
# coding:utf-8
# ma.py

# import cal # 直接執行本文件時,用此方式導入

# from my_mod import cal  # 被上一級調用時,用此方式導入。

import sys,os

BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

print(BASE_DIR)
print(os.path.abspath(__file__)) # 本文件的絕對路徑

#  加入項目所在路徑, 同時解決本身的運行和被調用時的路徑問題。
sys.path.append(BASE_DIR)

from my_mod import cal

def run():
    print(cal.add(7,5))

run()
技術分享圖片

技術分享圖片
#!/usr/bin/env python
# coding:utf-8
# bin.py

from my_mod import ma

# ma.run()

## 模塊的種類 :
# 1. 內置模塊
# 2. 第三方模塊
# 3. 自定義模塊

### 包 和 文件夾 的區別: 是否有 __init__.py 文件

if __name__ =="__main__": # 假設將當前腳本作為主函數,僅可執行,不允許被調用。 可以避免反復調用帶來的坑
    ma.run()
技術分享圖片

動態導入模塊: 參考: https://www.cnblogs.com/zy6103/p/6943557.html

技術分享圖片
#!/usr/bin/env python
# coding:utf-8

# 動態導入的方法:

# mt = __import__(‘m1.t‘) # 只能導入最頂級模塊 點後面的不會被導入
# print(mt)
# m1.t.test1()
#
# from m1.t import test1,_test2
#
# test1()
# _test2()

import importlib

m = importlib.import_module(‘m1.t‘) # 動態導入就是基於反射的

print(m)
m.test1()
m.test2()

‘‘‘
動態導入模塊方法1: __import__ 

說明:

  1. 函數功能用於動態的導入模塊,主要用於反射或者延遲加載模塊。

  2. __import__(module)相當於import module

舉例說明:

首先創建一個模塊目錄lib,然後在目錄內創建一個模塊為:aa.py

模塊代碼為:

class c(object):
    def __str__(self):
        return ‘C language‘
在lib目錄平級新建一個測試的模塊,使用 __import__ 動態以字符串形式導入lib下的aa模塊。

lib = __import__(‘lib.aa‘) # 相當於import lib
c = lib.aa.c()
print(c)
動態導入模塊方法2:import importlib

實例還是上面的lib.aa模塊,這裏使用importlib進行動態導入(這個方法好理解,也是官方建議使用的)

import importlib
aa = importlib.import_module(‘lib.aa‘)
c = aa.c()
print(c)
‘‘‘
技術分享圖片

如果自定義的模塊中有寫 __all__ = [‘read‘,‘read2‘] # 此方法的列表中只和 import * 有關系
被導入後則只能使用 列表中列出的內容。

包: 類似於文件夾,例如 當前項目day20 下有 glance目錄,下面又有 api, cmd, db 三個子目錄,

import glance
glance.db.models.register_models(‘mysql‘)
glance.api.policy.get()
glance.cmd.manage.ma()

想要使用glance 下面子目錄中的模塊,則需要每級目錄下面的 __init__.py 有相應的導入動作. 這樣,整個glance包內的模塊都可以使用了。

第三方軟件安裝:

1. pip包管理器

2. 源碼安裝: 下載,解壓, 執行python setup.py build 編譯, 執行 python setup.py install 安裝

python模塊之os_sys_動態導入_包