Shell+Python混合編程的實現

2022-01-02 蘇理士多雲

在Linux系統當中,有時Shell腳本的功能並不能完全滿足我們的需求,尤其是遇到一些循環和數值計算,以及一些交互功能的實,這時,Python的優勢就十分明顯了。

本人今天稍微整理了以下關於Python+Shell混合編程的一些方法和應用到的一些模塊,並通過Shell+Python設計了一個針對VASP的交互腳本,供大家參考。

#!bin/sh
echo "hello shell"
#下面是調用python解釋器
/usr/bin/python<<-EOF
print('hello python')
EOF

輸出結果:

hello this is shell
hello this is python

(1)如果調用python腳本時,使用:python ***.py #!/usr/bin/python 被忽略,等同於注釋。(2)如果調用python腳本時,使用:./***.py #!/usr/bin/python 指定解釋器的路徑。

向python函數中傳遞shell變量

此時在python腳本中需要引入sys模塊,從而調用外部參數。

這裡還是在shell腳本中引入python

   #!bin/sh
   echo "hello shell"
   i=0.05;j=1.2;k=4
   #寫入python腳本
   cat > test.py <<EOF
   import sys
   i= float(sys.argv[1])
   j=float(sys.argv[2])
   k=int(sys.argy[3])
   print("the number is {}".format(i+j+k) )
   EOF
   #引用shell腳本參數並調用python函數
   python test.py $i $j $k

輸出結果:

   hello shell
   the number is 5.25

利用os.system() 直接執行系統操作,並列印在屏幕上
     import os
     os.system('ls')

利用os.popen()

執行作業系統的命令,會將結果保存在內存當中,可以用read()方法讀取出來

     res = os.popen('ls -l')
     print res
     #or 
     print res.read()

       import subprocess
       # python 解析則傳入命令的每個參數的列表
       subprocess.run(["df","-h"])
       # 需要交給Linux shell自己解析,則:傳入命令字符串,shell=True
       subprocess.run("df -h|grep /dev/sda1",shell=True)

 - subprocess.call()

執行命令,返回命令的結果和執行狀態,0或者非0

     res = subprocess.call(["ls","-l"])
     res
     #輸出0或者非0

 - subprocess.check_call()

執行命令,返回結果和狀態,正常為0 ,執行錯誤則拋出異常.語法同上



- subprocess.getstatusoutput()

接受字符串形式的命令,返回 一個元組形式的結果,第一個元素是命令執行狀態,第二個為執行結果

     res = subprocess.getstatusoutput('pwd')

 - subprocess.getoutput()

     #!/share/home/wanjg/WSY/software/Anaconda/bin/python3
       2 import subprocess
       3 def fun(command):
       4     ret = subprocess.getoutput(command)
       5     print(ret)
       7 fun('ls -a')
     

   接受字符串形式的命令,返回執行結果。

- subprocess.check_output()

執行命令,返回執行的結果,而不是列印(以字節形式返回)

實例:以下是我根據上述shell+Python混合編程的方法,簡單實現了對VASP進行縮放係數優化的腳本,主要利用了Python的subprocess模塊進行實現。

   #!/share/home/wanjg/WSY/software/Anaconda/bin/python3
   import os
   import subprocess
   import numpy as np
   filepath=os.getcwd()
   #選擇功能
   fun = int(input("Set scaling factor\n1.Calculation\n2.Get Energy\n"))
   if fun==1:
    #選擇縮放係數的範圍和步長
      Min=float(input('Please enter the minmum scaling factor:\n'))
      Max=float(input('Please enter the maximum scaling factor:\n'))
      step=float(input("Please input the step:\n"))
      fp=open('file-name','w+')
      for items in np.arange(Min,Max+step,step):
           filename=str(float('%.3f' % items))
           fp.write(filename+'\n')
           os.mkdir(filename)
           os.chdir(filepath+'//'+filename)
           subprocess.call('cp ../INCAR ../POSCAR ../KPOINTS ../POTCAR ./',shell=True)
           commands="sed -n 2c"+filename+" POSCAR"
          #print(commands)
           subprocess.run(commands,shell=True)
           #運行VASP,可根據自己伺服器修改
           run="source ~/.bashrc"+";"+"wsy_vasp"+" "+filename+" 24"
           subprocess.call(run,shell=True)
           os.chdir(filepath)
           pass
       fp.close()
    if fun==2:
       #將各個體系的能量數據寫入Energy.dat
       filename=open("file-name",'r')
       data=open('Energy.dat','w')
       #讀取能量數據操作
       commands="grep TOTEN OUTCAR|tail -1|awk '{printf \"%12.6f\", $5}'"
       #讀取並寫入能量數據
       for items in filename.readlines():
           i= items.split()[0]
           os.chdir(filepath+'//'+i)
           ret=subprocess.getoutput(commands)
           os.chdir(filepath)
           data.write(ret+'\n')

相關焦點

  • python+C、C++混合編程的應用
    我看到的一個很好的Python與c/c++混合編程的應用是NS3(Network Simulator3)一款網絡模擬軟體,它的內部計算引擎需要用高性能,但在用戶建模部分需要靈活易用。NS3的選擇是使用C/C++來模擬核心部件和協議,用python來建模和擴展。這篇文章介紹python和c/c++三種混合編程的方法,並對性能加以分析。
  • 正確的使用python調用shell的姿勢
    python是一門簡潔靈活的語言,也是一門膠水語言,能與很多其他的程式語言進行交互,雖然性能差一點,但易用,入門和上手都比較簡單,所以一直以來都被使用廣泛
  • 玩轉Linux - shell 編程基礎(一)
    業界所說的shell通常都是指shell腳本,但讀者朋友要知道,shell和shell script是兩個不同的概念。由於習慣的原因,簡潔起見,本文出現的「shell編程」都是指shell腳本編程,不是指開發shell自身(如Windows Explorer擴展開發)。
  • 【Slog】shell編程基礎——列印
    所以最近通過專項的學習來補充腳本技能樹部分的shell編程部分,一般要求的腳本skill就只剩下一個Perl了,得再加把勁了。2.0 傳統藝能——Hello World 幾乎每一種程式語言的第一個程序都離不開「Hello World」,shell中的如下: #!
  • Linux 平臺下 Python 腳本編程入門(一)
    大多數人會認為 Bash (或者其他的 shell 語言)用起來很方便,但一些強大的語言(比如 Python)會給你帶來一些其它的好處。在 Linux 中學習 Python 腳本編程首先,我們會使用 Python 的命令行工具,還會接觸到 Python 的面向對象特性(這篇文章的後半部分會談到它)。
  • 【超詳細 | Python】CS免殺-Shellcode Loader原理(python)
    最近在學習cs免殺,由於比較菜只懂python語言,就先了解py是如何實現加載shellcode寫入內存的。
  • 玩轉 Linux - shell 編程基礎
    很多時候伺服器都需要編寫一些計劃任務來定時運行的,所以掌握一些基本的 shell 編程基礎很有必要。本文是我在網上收集的一些資料,主要目的是幫助自己更好的了解掌握 shell 編程的一些基礎知識。什麼是Shell腳本示例看個例子吧:#!
  • 「技術文章」《Python 資料庫 GUI CGI編程》
    2.1 Linux下安裝MySQLdb模塊 使用包安裝可以 wget http://sourceforge.net/projects/mysql-python/files/latest/download$ tar xfz MySQL-python-1.2.3.tar.gz$ cd MySQL-python-1.2.3$whereis mysql_config
  • Python學習第61課-shell用cat和less打開文件
    【每天幾分鐘,從零入門python編程的世界!】●shell打開文件①cat 要打開文件的路徑在shell中,用cat命令打開文件跟用滑鼠點擊打開文件一樣的效果。打開文件,只顯示一頁②less 要打開文件的路徑用cat打開文件,如果文件內容很多,shell窗口顯示不下,我們查看裡面的內容很不方便,就需要滑鼠滾輪滾動,那麼我們可以用less這個命令打開文件,一次只會打開窗口大小的一頁內容。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    6套課程) 資料庫操作(1套課程) python高級編程(6套課程) 注:零基礎全能篇中,針對windows和liunx系統均有兩套課程可供選擇學習,單純學python,哪個系統都一樣,初學者只需選擇自己熟悉的系統學習相應課程即可。
  • Python遊戲編程
    為了達到這一目的,本課程應用python語言的語法知識帶領學生從無到有的開發遊戲,通過每個遊戲項目逐步應用學到的語法知識,在實際編程中加深體會。在課程設計中儘量站在初學者的角度,降低開發遊戲的難度,從而方便學生理解及掌握遊戲編程的基本原理和實現方法,逐步提高學生對編程的興趣和能力。
  • Shell編程——流程控制語句
    第二章:shell編程2.4 流程控制語句與傳統的程式語言不同的是,shell用於指定條件值得不是布爾運算式常用操作命令Linux常用操作命令——文件和目錄操作Linux常用操作命令——文本顯示和處理Linux常用操作命令——文件和命令查找&系統消息顯示第二章:shell
  • 程式設計師Python編程必備5大工具,你用過幾個?
    Python是編程入門不錯的選擇,現在也有不少的程式設計師業餘時間會研究這門程式語言。學習Python有時候沒有第一時間找到好工具,會吃不少的苦頭。畢竟好的工具能將工作效率多倍速提升。下面W3Cschool給小夥伴們推薦Python編程必備的5大工具:0、IpythonIPython是一個基於Python Shell的交互式解釋器。
  • 設置並使用樹莓派進行Python和C語言編程
    LXTerminal用於訪問shell(又稱命令行)。Raspbian系統上的默認shell是BASH.命令行提示和技巧在樹莓派上編程會頻繁使用命令行。默認可以通過LXTerminal訪問命令行。默認為Raspberry pi~            shell的當前工作目錄,默認工作目錄為主文件夾$            shell提示符,其後為命令。
  • 學習 Shell 腳本編程的免費資源 | Linux 中國
    雖然有不同類型的 shell,但是 bash(GNU Bourne-Again Shell)是在各 Linux 發行版中最流行的。當談到 shell 腳本編程的時候,也就意味著 —— 用戶希望使用腳本來執行多條命令來獲得一個輸出。也許你需要學習 shell 腳本編程作為你的課程或者工作的一部分。
  • python基礎知識科普:python的起源和發展史以及應用場景
    他作為一個數學家其實更大的樂趣卻在計算機編程裡面。在Guido的那個年代程式語言的設計原則是讓機器更快的運行,諸如Pascal、C、Fortran等語言。但是這樣的編程方式,編寫一個程序的過程需要耗費大量的時間,所以他的另一個選擇是shell。Bourne Shell作為UNIX系統的解釋器已經長期存在。
  • Shell編程實戰練習,(BAT內部使用)!
    如下為第一個Shell編程腳本,腳本名稱為:first_shell.sh,代碼內容如下:First_shell.sh腳本內容詳解如下:Shell腳本編寫完畢,如果運行該腳本,運行用戶需要有執行權限,可以使用chmod o+x first_shell.sh賦予可執行權限。然後.
  • 資料|《Linux 命令行與 shell 腳本編程大全》
    今日資料推薦《 Linux 命令行與 shell 腳本編程大全》這是一本關於 Linux 命令行與 shell 腳本編程的全方位教程,主要包括四大部分:Linux 命令行,shell 腳本編程基礎,高級 shell 腳本編程,如何創建實用的 shell 腳本。
  • 百道Python面試題實現,搞定Python編程就靠它
    想要備戰 Python 面試,這兩個項目有千道 Python 問題與實現。昨天機器之心介紹了 PHD 大牛的求職之路,很多讀者感覺這位大牛太厲害了,他的經歷對我們幫助不大。對於一般的機器學習求職者而言,最基礎的就是掌握 Python 編程技巧,隨後才是相關算法或知識點的掌握。
  • 【Shell編程008】循環:for
    收錄於話題 #shell示例如下:[root@linuxido ~]# cat ftpimg.txt ## 準備一個txt文件,內容是每行存放一個文件地址img/20201110/1f10fc3d-d164-4f18-b208-473c94803826.jpgimg/702020110675422689/20201216/91f45708-f634