主頁 >  其他 > Linux系統shell腳本、python腳本撰寫

Linux系統shell腳本、python腳本撰寫

2021-10-22 09:21:39 其他

GPU排隊腳本

python腳本

GPU排隊腳本 ---- GPU一旦空閑觸發腳本執行程式

參考: GPU排隊腳本(python腳本)

cmd = 'bash run.sh' 該句設定要執行的python腳本

import os
import sys
import time

cmd = 'bash run.sh' #設定運行的腳本

def gpu_info():
    gpu_status = os.popen('nvidia-smi | grep %').read().split('|')
    gpu_memory = int(gpu_status[2].split('/')[0].split('M')[0].strip())
    gpu_power = int(gpu_status[1].split('   ')[-1].split('/')[0].split('W')[0].strip())
    return gpu_power, gpu_memory

def narrow_setup(interval = 2):
    gpu_power, gpu_memory = gpu_info()
    i = 0
    while gpu_memory > 10000 or gpu_power > 100:  #set waiting condition
        gpu_power, gpu_memory = gpu_info()
        i = i % 5
        symbol = 'monitoring: ' + '>' * i + ' ' * (10 - i - 1) + '|'
        gpu_power_str = 'gpu power: %d W |' % gpu_power
        gpu_memory_str = 'gpu memory: %d MiB |' % gpu_memory
        sys.stdout.write('\r' + gpu_memory_str + '\t' + gpu_power_str + '\t' + symbol)
        sys.stdout.flush()  #sys.stdout.flush()的作用就是顯示地讓緩沖區的內容輸出
        time.sleep(interval)
        i += 1
    print("\n" + cmd)
    os.system(cmd)

if __name__ == '__main__':
    narrow_setup()

即可 監聽nvidia-smi的資訊, 以伺機觸發python腳本, 當GPU的顯存以及功耗低于某個值時,便會觸發python腳本,

shell腳本

可以在shell腳本中直接添加訓練訓練模型的陳述句

#!/bin/bash
var=0

while [ $var -eq 0 ]
do
    count=0
    for i in $(nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits)
    do
        if [ $i -lt 500 ]
        then
            echo 'GPU'$count' is available'
            bash run.sh #訓練模型的陳述句
            var=1
            break
        fi
        count=$(($count+1))
        #echo $count
    done
done

Linux命令

more命令

more命令查看檔案分頁顯示

(more +N file_name 從指定行開始顯示)

(more -N file_name 設定每次螢屏顯示的行數)

  • 空格鍵:查看下一屏
  • 回車鍵:往下滾動一行
  • b鍵:往前查看一屏
  • q鍵:退出

管道符 |

命令格式:命令A | 命令B (即命令A的正確輸出作為命令B的操作物件)

cat file | more(先展示了file中的內容,然后more指令再處理file的內容)

grep指令

grep(global search regular expression(RE) and print out the line,全面搜索正則運算式并把行列印出來):使用正則運算式搜索文本,并把匹配的行列印出來,

id    name    java
1     90      90
2     lisi    89
3     wangw   93
4     zhao    82
grep -c 字串 檔案名:計算找到搜索字串的行數
grep -c "name" student.txt
#1
grep -o 字串 檔案名:指出匹配的內容
grep -o "zhang" student.txt
#
grep -o "zh" student.txt
#zh
grep -i 字串 檔案名:不區分大小寫列印出一行資訊
grep -i "zh" student.txt
#4    zhao    82
grep -n 字串 檔案名:顯示行號
grep -n "zh" student.txt
5:4    zhao    82

cut指令

cut:提取某一列

cut -f 列號:提取第幾列

-d 分隔符:按照指定分隔符分割列

awk指令

Shell腳本撰寫

Linux之Shell腳本編程(一)

shell腳本編程快速入門

Shell是命令解釋器(command interpreter),是Unix作業系統的用戶介面,

Shell也是一門編程語言,即shell腳本,shell是解釋執行的腳本語言,可直接呼叫linux命令,一個系統可以存在多個shell,可以通過cat /etc/shells命令查看系統中安裝的shell,不同的shell可能支持的命令語法是不相同的,

一、shell種類

作業系統內核(kernel)與shell是獨立的套件,而且都可以被替換,不同的作業系統使用不同的shell;同一個kernel之上可以使用不同的shell,

常見的shell分為兩大主流:

sh:

  • Bourne shell (sh), Solaris, hpux 默認shell
  • Bourne again shell (bash), Linux系統默認shell

csh:

  • C shell(csh)
  • tc shell(tcsh)

查看使用的shell

echo $SHELL
#/bin/bash

shell環境定義

臨時環境變數:所謂臨時環境變數是指用戶在當前登陸環境生效的變數,用戶登錄系統后,直接在命令列上定義的環境變數只能在當前的登錄環境中使用,當退出系統后,環境變數將不能在下次登錄時使用

將環境變數永久生效:通過將環境變數定義寫入到組態檔中,用戶每次登錄時系統自動定義,則無需再到命令列重新定義,定義環境變數的常見組態檔如下:

/etc/profile 針對系統所有用戶生效,此檔案應用于所有用戶每次登錄系統時的環境變數定義

$HOME_name/.bash_profile 針對特定用戶生效,$HOME為用戶的宿主目錄,當用戶登錄系統后,首先繼承/etc/profile檔案中的定義,再應用$HOME/.bash_profile檔案中的定義

系統預定義的環境變數:系統環境變數對所有用戶有效,如:$PATH、$HOME、$SHELL、$PWD等等,用echo命令列印上述的系統環境變數

echo $PATH  #/opt/conda/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
echo $PWD
#/workspace
echo $SHELL
#/bin/bash
echo $HOME
#/root

shell腳本編程

同傳統的編程語言一樣,shell提供了很多特性,這些特性可以使得shell腳本編程更為有用,

創建shell腳本

  • 首行:第一行內容在腳本的首行左側,表示腳本將要呼叫的shell解釋器,內容如下:#!/bin/bash, #! 符號能夠被內核識別是一個腳本的開始,這一行必須位于腳本的首行, /bin/bash 是bash程式的絕對路徑,在這里表示后續的內容將通過bash程式解釋執行,
  • 注釋:注釋符號 # 放在需注釋內容的前面, 多行注釋:需要注釋多行代碼:<<EOF EOF將多行注釋的內容嵌套在里面
  • 內容:可執行內容和shell結構

shell腳本的權限

一般情況下,默認創建的腳本是沒有執行權限的,沒有權限不能執行,需要賦予可執行權限,

chmod +x test.sh

shell腳本的執行

1.輸入腳本的絕對路徑或相對路徑

  • /workspace/test.sh
  • ./test.sh

2.bash或sh + 腳本(當腳本沒有x權限時,root和檔案所有者通過該方式可以正常執行)

  • bash test.sh
  • sh test.sh

3. 在腳本的路徑前加“.”或source

  • source /workspace/test.sh
  • . test.sh

第一種和第二種會新開一個bash,不同bash中的變數無法共享,但是使用. ./test.sh 這種方式是在同一個shell里面執行的,

二、shell變數

變數:是shell傳遞資料的一種方式,用來代表每個取值的符號名,當shell腳本需要保存一些資訊時,即將它存放在一個變數中,

變數設定規則:

  • 變數名稱可以由字母,數字和下劃線組成,但是不能以數字開頭,環境變數名建議大寫,便于區分
  • 在bash中,變數的默認型別都是字串型,如果要進行數值運算,則必須指定變數型別為數值型
  • 變數用等號連接,等號左右兩側不能有空格
  • 變數的值如果有空格,需要使用單引號或者雙引號包括

變數分類:

Linux Shell中的變數分為用戶自定義變數,環境變數,位置引數變數和預定義變數,可以通過set命令查看系統中存在的所有變數,

  • 系統變數:保存和系統操作環境相關的資料,$HOME, $PWD, $SHELL, $USER等等,
  • 位置引數變數:主要用來向腳本中傳遞引數或資料,變數名不能自定義,變數作用固定,
  • 預定義變數:是Bash中已經定義好的變數,變數名不能自定義,變數作用也是固定的,

用戶自定義變數

用戶自定義的變數由字母或下劃線開頭,由字母,數字或下劃線序列組成,并且大小寫字母意義不同,變數名長度沒有限制,只讀型別變數,使用readonly命令

設定變數,習慣上用大寫字母來命名變數,變數名以字母表示的字符開頭,不能用數字,

變數呼叫,在使用變數時,要在變數名前加上前綴"$",使用echo命令查看變數值,eg: echo $A

變數賦值

  • 定義時賦值:變數=值(等號兩側不能有空格)eg:STR="hello world" A=9
  • 將一個命令的執行結果賦值給變數:
    • A=`ls -la`反引號,運行里面的命令,并把結果回傳給變數A
    • A=$(ls -la)等價于反引號 eg:aa=$((4+5)) bb=`expr 4 + 5`
    • 將一個變數賦值給另一個變數 eg:A=$STR

變數疊加

aa=123
echo $aa
#123
cc="$aa"456
echo $cc
#123456
dd=${aa}789
echo $dd
#123789

單引號和雙引號的區別:

現象:單引號里的內容會全部輸出,而雙引號里的內容會有變化

原因:單引號會將所有特殊字符脫意

  • 在對變數進行取值時,使用"#"符號對字串進行取值
  • 提取子字串,使用字串的截取命令,用于提取部分字串 str:k1:k2
  • 查找字串,用于查找字符的位置,輸出結果為字符在字串中所占的資料位置,如果查找多個字符,哪個字母先出現即先計算哪個
NUM=10
SUM="$NUM hehe"
echo $SUM
#10 hehe
SUM2='$NUM hehe'
echo $SUM2
#$NUM hehe
string="abcd"
echo ${#string}    #4
string="this is a test"
echo ${string:2:6}    #is is
string="this is a test"
echo `expr index "$string" "it"`    #1

列出所有的變數, set

洗掉變數,unset NAME(unset撤銷變數,對于readonly B=2宣告靜態的變數B=2,不能unset)

用戶自定義的變數,作用域為當前的shell環境

環境變數

用戶自定義變數只在當前的shell中生效,而環境變數會在當前shell和其子shell中生效,如果把環境變數寫入相應的組態檔,那么這個環境變數就會在所有的shell中生效,

export 變數名=變數值 申明變數

預定義變數

$? 執行上一個命令的回傳值,執行成功,回傳0, 執行失敗,回傳非0

$$ 當前行程的行程號(PID),即當前腳本執行時生成的行程號

$! 后臺運行的最后一個行程的行程號(PID),最近一個被放入后臺執行的行程

expr命令:四則運算和字串運算

expr的字串運算能力

  • match match STRING REGEXP STRING中匹配REGEXP字串并回傳匹配字串的長度
  • substr substr STRING POS LENGTH 從POS位置獲取長度為LENGTH的字串
  • index index STRING SUBSTR 查找子字串的起始位置
  • length length STRING 計算字串的長度

三、shell陣列

在bash下,僅僅支持一維陣列,并且沒有限定陣列的大小,不支持多維陣列,類似于C語言,陣列元素的下標由0開始編號,獲取陣列中的元素要利用下標,下標可以是整數或者算術運算式,其值應當大于或等于0,

定義陣列:在shell中,用()來定義陣列,陣列中元素用"空格"符號分割開,定義陣列一般形式為:

陣列的三種定義形式;讀取陣列和讀取變數名相同,使用$符號;獲取陣列長度的方法與獲取字串長度的方法相同,

#!/bin/bash

array_name=(value1 value2 value3 value4)
array_test=(
value1
value2
value3
value4
)
array_text[0]=value0
array_text[1]=value1
array_text[3]=value3

valuen=${array_name[2]}
echo $valuen    #輸出    value3

echo ${array_name[n]}    #輸出    value1
echo ${array_name[@]}    #輸出    value1 value2 value3 value4

length=${#array_name[@]}
echo $length    #輸出    4
length=${#array_name[*]}
echo $length    #輸出    4
length=${#array_name[0]}
echo $length    #輸出    6

四、shell傳遞引數

在執行shell腳本時,向腳本傳遞引數,腳本內獲取引數的格式為:$n,n代表一個數字,1為執行腳本的第一個引數,2為執行腳本的第二個引數,以此類推……

在使用shell傳遞引數時,需要用到以下的幾個字符來處理引數

  • $#:傳遞到腳本的引數個數
  • $$:腳本運行的當前行程ID號
  • $!:后臺運行的最后一個行程的ID號
  • $?:顯示最后命令的退出狀態,0表示沒有錯誤,其他任何值表明有錯誤
  • $*:以一個單字串顯示所有向腳本傳遞的引數
  • $@:與*相同,添加引號,在引號中回傳每個引數
#!/bin/bash
echo "傳遞引數實體!";
echo "執行的檔案名:$0";
echo "第一個引數為:$1";
echo "第二個引數為:$2";
echo "第三個引數為:$3";

echo "引數個數為:$#";
echo "腳本運行的行程ID號:$$";
echo "后臺運行的最后一個行程的ID號:$!";
echo "顯示最后命令的退出狀態:$?";

echo "輸出向腳本傳遞的引數:$*"
echo "輸出向腳本傳遞的引數:$@"

#執行 bash test.sh 1 2 3

#輸出
傳遞引數實體!
執行的檔案名:test.sh
第一個引數為:1
第二個引數為:2
第三個引數為:3
引數個數為:3
腳本運行的行程ID號:24610
后臺運行的最后一個行程的ID號:
顯示最后命令的退出狀態:0
輸出向腳本傳遞的引數:1 2 3
輸出向腳本傳遞的引數:1 2 3

五、shell運算子

shell運算子種類,shell同樣支持多種運算子

  • 算數運算子
  • 關系運算子
  • 布爾運算子
  • 邏輯運算子
  • 字串運算子
  • 檔案測驗運算子

shell想要使用這些運算子,需要結合其他命令和工具來使用,使用算術運算子需要搭配的常用兩種工具是:awk、expr

  • 運算式和運算子之間必須要用空格(必須寫成3 + 2)
  • 完整的運算式要被兩個"`"包含

運算子和數之間必須用空格隔開

算數運算子

+ - * / % = == !=

備注:算數運算子中的乘號(*)前面必須加反斜杠才能實作乘法運算

關系運算子

shell中使用特殊的字符表示關系運算子,并且只支持數字,不支持字串,除非字串是數字

-eq -ne -gt -lt -ge -le

布爾運算子

! (非運算) -o (或運算) -a(與運算)

邏輯運算子

&&(邏輯中的AND) ||(邏輯中的OR)

此處使用兩層的[]符號,將兩次關系運算的結果保存在條件句中

字串運算子

= != -z ???????-n $(檢測字串是否為空)

檔案測驗運算子

shell中的檔案測驗運算子用于檢測在類unix系統中,檔案的各種屬性

#!/bin/bash

val=`expr 3 + 2`
echo "兩個數和為:$val" #兩個數和為:5

a=10
b=20

if [ $a -eq $b ]
then
    echo "$a -eq $b : a 等于 b"
else
    echo "$a -eq $b :a 不等于 b"
fi
#10 -eq 20 :a 不等于 b

if [ $a -ne $b ]
then
    echo "$a -ne $b : a 不等于 b"
else
    echo "$a -ne $b : a 等于 b"
fi
#10 -ne 20 : a 不等于 b

a=10
b=20
if [ $a -eq 10 -o $b -eq 20 ]
then
    echo "TRUE"
else
    echo "FALSE"
fi
#TRUE

if [[ $a -lt 100 && $b -gt 100 ]]
then
    echo "回傳 true"
else
    echo "回傳 false"
fi
#回傳 false

a="abc"
b="efg"
if [ $a != $b ]
then
    echo "$a != $b : a 不等于 b"
else
    echo "$a != $b : a 等于 b"
fi
#abc != efg : a 不等于 b

file="./test.sh"
if [ -r $file ]
then
    echo "檔案可讀"
else
    echo "檔案不可讀"
fi
#檔案可讀

六、 shell編程中的命令

echo命令(echo命令在shell中用于字串的輸出,呼叫的格式:echo string)

> 結果定向重定向至檔案

-e 表示開啟轉義

#!/bin/bash
echo "this is a test"
echo \"this is a test\"
name="ohuohuo"
echo "your name is $name"
echo -e "Right! \n" # -e 表示開啟轉義
echo "this is other line"
echo "this is a test" > testfile
echo `date`
#執行命令
bash test.sh
#輸出:
this is a test
"this is a test"
your name is ohuohuo
Right!

this is other line
Mon 18 Oct 2021 10:06:50 PM HKT

printf命令 (shell中的printf命令如同C語言中的一樣,不過不會自動呼叫換行符號,呼叫的格式:printf format-string [arguments...](format-string格式控制字串, arguments引數串列))

printf命令可以使用較為強大的轉義字符

echo "Hello, Shell"
#輸出:Hello, Shell
printf "Hello, Shell\n"
#輸出:Hello, Shell 

test命令

shell中的test命令用于檢查某個條件是否成立,可以進行數值、字符和檔案三個方面的測驗

數值測驗命令表

引數說明
-eq(equal)等于則為真
-ne(no equal)不等于則為真
-gt(great than)大于則為真
-ge(great and equal)大于等于則為真
-lt(low than)小于則為真
-le(low and equal)小于等于則為真
#!/bin/bash

num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '兩個數相等!'
else
    echo '兩個數不相等!'
fi
#輸出:兩個數相等!

字串測驗表

引數說明
=等于則為真
!=不相等則為真
-z 字串字串長度為零則為真
-n 字串字串長度bu'wei'l
num1="name"
num2="function"
if test $num1 = $num2
then
    echo '兩個字串相等!'
else
    echo '兩個字串不相等!'
fi
#輸出:兩個字串不相等!

檔案測驗表

引數說明
-e 檔案名如果檔案存在則為真
-r 檔案名如果檔案存在且可讀則為真
-w 檔案名如果檔案存在且可寫則為真
-x 檔案名如果檔案存在且可執行則為真
-s 檔案名如果檔案存在且至少有一個字符則為真
-d 檔案名如果檔案存在且為目錄則為真
-f 檔案名如果檔案存在且為普通檔案則為真
-c 檔案名如果檔案存在且為字符型特殊檔案則為真
-b 檔案名如果檔案存在且為塊特殊檔案則為真
#!/bin/bash
if test -e ./test.sh
then
    echo '檔案已存在!'
else
    echo '檔案不存在!'
fi
#輸出:檔案已存在!

七、shell流程控制

shell作為一種腳本語言,有著自己的流程控制,而shell中的流程控制主要由條件、回圈組成,

if else條件

條件模板為 if - then - elif - then - else - fi

#!/bin/bash
num1=$[6]
num2=$[8]
if test $[num1] -eq $[num2]
then
    echo "兩個數字相等"
else
    echo "兩個數字不相等"
fi
#兩個數字不相等

case條件

  • 取值后面需要加上in
  • 每一模式必須以右括號結束
  • 每個模式結束后使用;;符號結尾
  • 如果沒有找到對應的模式,以*結尾,并跳出case
  • case需要搭配esac結尾,與C語言中的switch … case陳述句類似

case中想要跳出回圈有兩個命令:break和continue

break命令:允許跳出所有回圈(中止執行后面所有的回圈)

continue命令:不會跳出所有回圈,僅僅跳出當前回圈,與其他型別的語言相同

#!/bin/bash
echo '輸入1到4之間的數字:'
echo '你輸入的數字為:'
read num
case $num in
    1)  echo '你選擇了1'
    ;;
    2)  echo '你選擇了2'
    ;;
    3)  echo '你選擇了3'
    ;;
    4)  echo '你選擇了4'
    ;;
    *)  echo '你沒有輸入1-4之間的數字'
    ;;
esac
#輸出:
輸入1到4之間的數字:
你輸入的數字為:
3
你選擇了3

while :
do
    echo "輸入1-4之間的數字:"
    read num
    case $num in
        1|2|3|4) echo "你輸入的數字為 $num !"
        ;;
        5) echo "你輸入的數字是5"
            continue
            echo "游戲結束"
        ;;
        *) echo "你輸入的數字不是1-5之間的!游戲結束"
            break
        ;;
    esac
done
#輸出
輸入1-4之間的數字:
5
你輸入的數字是5
輸入1-4之間的數字:
3
你輸入的數字為 3 !
輸入1-4之間的數字:
6
你輸入的數字不是1-5之間的!游戲結束

for回圈

條件模板 for var in item1 item2 ... itemN -- do command1 -- done

while回圈

條件模板 while condition -- do command -- done

until回圈

條件模板 until condition -- do command -- done

for num in 1 2 3 4 5
do
    echo "The value is : $num"
done
#輸出:
The value is : 1
The value is : 2
The value is : 3
The value is : 4
The value is : 5

num=1
while(( $num <= 5 ))
do
    echo $num
    let "num++"
done
#輸出:
1
2
3
4
5

a=0
until [ ! $a -lt 5 ]
do
    echo $a
    a=`expr $a + 1`
done
#輸出
0
1
2
3
4

八、shell函式

Linux中的shell同樣可以定義函式,然后在函式中呼叫執行相關的shell命令,完成功能,

所有的函式在使用前必須定義,因為shell解釋器是順序逐層執行的,當shell解釋器發現定義的函式時,才會找到對應的功能,進而執行,

[function] funname[()]
{
    action;
    [return int;]
}
function fun()表示有回傳引數的函式
fun()表示無回傳引數的函式
使用return可以回傳引數值,如果不使用,將默認以最后一條命令運行的結果作為回傳值
#!/bin/bash

FunReturn(){
    echo "兩個數字進行相加運算..."
    echo "輸入第一個數字:"
    read num
    echo "輸入第二個數字:"
    read anothernum
    echo "兩個數字分別為 $num 和 $anothernum "
    return $(( $num + $anothernum ))    #分別回傳數值
}

FunReturn   #呼叫函式
echo "輸入的兩個數字之和為 $? !"    #使用通配符獲取上一條指令的回傳值
#輸出
兩個數字進行相加運算...
輸入第一個數字:
3
輸入第二個數字:
4
兩個數字分別為 3 和 4
輸入的兩個數字之和為 7 !

九、shell重定向

Linux命令中的shell重定向

Python腳本撰寫

python的sys、os、time模塊的使用

sys模塊

1. sys.argv:實作從程式外部向程式傳遞引數,

位置引數argv[0]代表py檔案本身, 運行方法python test.py 引數1, 引數2

# test.py
import sys
if __name__ == "__main__":
    self = sys.argv[0]
    name = sys.argv[1]
    age = sys.argv[2]
    print(self, name, age)
# 運行程式
python test.py xiaoming 18

2. sys.getdefaultencoding():獲取系統當前編碼,一般默認為ascii,

print(sys.getdefaultencoding())

3. sys.path:獲取指定模塊搜索路徑的字串集合

print(sys.path)

4.sys.platform:獲得當前系統平臺

print(sys.platform)

5.sys.exit():執行到主程式末尾,解釋器自動退出,但是如果需要中途退出程式,可以呼叫sys.exit()函式,帶有一個可選的整數引數回傳給呼叫它的程式, 表示在主程式中捕獲對sys.exit()的呼叫

import os
if __name__ == "__main__":
    for i in range(1, 10):
        print("第%s次:"%i)
        if i == 5:
            print("第五次退出")
            sys.exit(0)

os模塊

1.os.name: 判斷現在正在使用的平臺,Windows回傳'nt', Linux回傳’posix‘

print(os.name)    #posix

2.os.getcwd():得到當前作業的目錄

print(os.getcwd())    #/workspace/CCF_2021/question_matching

3. os.listdir():指定所有目錄下所有的檔案和目錄名

print(os.listdir('.'))

4. os.remove():洗掉指定檔案

os.remove('test.txt')

5.os.rmdir():洗掉指定目錄(不能夠嵌套洗掉目錄)

os.rmdir('test')

6.os.mkdir():創建目錄(該方法只能建立一層目錄,遞回建立使用os.makedirs())

os.mkdir('test')
os.makedirs('test/test')

7.os.path.isfile():判斷指定物件是否為檔案,是則回傳True, 否則False

print(os.path.isfile('test.py'))

8.os.path.isdir():判斷指定物件是否為目錄,是則回傳True, 否則False

print(os.path.isdir('test'))

9.os.path.exists():判斷指定物件是否存在,是則回傳True,否則False(判斷檔案夾或者檔案等是否存在)

os.path.exists(test)

10.os.path.split():回傳路徑的目錄和檔案名

os.path.split('/workspace/CCF_BDCI2021/question_matching/data')
#輸出:('/workspace/CCF_BDCI2021/question_matching', 'data')

11.os.getcwd():獲得當前作業的目錄

print(os.getcwd())

12.os.system():執行shell命令

var = 123
os.environ['var'] = str(var)    #注意此處[]內的是“字串”
os.system('echo $var')
#輸出:
123
0

13.os.chdir():用于改變當前作業目錄到指定的目錄(將作業目錄改到指定目錄)

print(os.getcwd())
#輸出:/workspace/CCF_BDCI2021/question_matching/test
os.chdir('/workspace')
print(os.getcwd())
#輸出:/workspace

14.os.path.getsize():獲得檔案的大小

print(os.path.getsize('test.py'))

15.os.path.abspath('.'):獲得絕對路徑

print(os.path.abspath('.'))
#輸出:/workspace/CCF_BDCI2021/question_matching

16.os.path.join(path, name):連接目錄和檔案名

os.path.join('/workspace/CCF_BDCI2021/question_matching', 'file')
#輸出:'/workspace/CCF_BDCI2021/question_matching/file'

17.os.path.realpath():獲得檔案所在的目錄

import os
import sys
if __name__ == "__main__":
    print(sys.argv[0])    #檔案的名字
    print(os.path.realpath(sys.argv[0]))    #檔案的路徑
    print(os.path.split(os.path.realpath(sys.argv[0])))    #將檔案的路徑和檔案名分割開
    print(os.path.split(os.path.realpath(sys.argv[0]))[0])    #輸出檔案的路徑


#輸出:
test.py
/workspace/CCF_BDCI2021/question_matching/test.py
('/workspace/CCF_BDCI2021/question_matching', 'test.py')
/workspace/CCF_BDCI2021/question_matching

18.os.path.basename():獲得路徑中檔案名 os.path.dirname():獲得檔案路徑名

print(os.path.basename('/workspace/CCF_BDCI2021/question_matching/test.py'))
#輸出:test.py
print(os.path.dirname('/workspace/CCF_BDCI2021/question_matching/test.py'))
#輸出:/workspace/CCF_BDCI2021/question_matching

time模塊

獲取時間

import time

ticks = time.time()
print(ticks)    

localtime = time.localtime(time.time())
print(localtime)    

localtime = time.asctime(time.localtime(time.time()))
print(localtime)

#1634397810.7200205
#time.struct_time(tm_year=2021, tm_mon=10, tm_mday=16, tm_hour=23, tm_min=23, tm_sec=55, tm_wday=5, tm_yday=289, tm_isdst=0)
#Sat Oct 16 23:24:41 2021

格式化日期

import time

print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
print(time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))

import calendar
cal = calendar.month(2021, 10)
print(cal)


#輸出
2021-10-16 23:39:59
Sat Oct 16 23:40:51 2021
    October 2021
Mo Tu We Th Fr Sa Su
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

python腳本撰寫實際操作

sys.stdout.write()將str寫到輸出流(只能輸出一個str, 原封不動輸出, 不會默認添加'\n')

sys.stdout.flush()的作用是顯示地讓緩沖區中的內容輸出(如果緩沖區的內容新增了換行符, 那么stdout就會自動將緩沖區內的內容輸出)

python中執行shell命令

  • 使用os.system()命令, os.system('cat /proc/cpuinfo')
  • 使用os.popen()命令,output = os.popen('cat /proc/cpuinfo') print(output.read()),通過os.popen()回傳的是file read的物件, 對其進行讀取read()的操作可以看到執行的輸出,但是無法讀取程式執行的回傳值,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/330463.html

標籤:其他

上一篇:關于ssh遠程登陸

下一篇:由0開始在碼云上搭建遠程倉庫托管eclipse本地代碼

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more