2016-11-07 11 views
0

subprocess.call()関数を使ってunix/linuxユーティリティを実行し、その出力を変数に格納して操作したいプログラムの他の部分でコマンドの出力を分析することができます。検討していたことは、出力をテキストファイルにリダイレクトしてテキストファイルを開き、ファイルの各行を繰り返してデータをリストに入力(格納)することでした。例として:Unixシェル引数の出力をPythonの変数に割り当てる方法

#! /usr/bin/python 

from subprocess import call 

# This listHome.py program has been designed and created as a 
# demonstration 
# author:oOpSgEoW 

class LstHome: 

    def lsthome(self): 
     # create the argument that will be passed to the call function 
     lsthme = 'ls $HOME > HomeList.txt' 
     # call the function 
     call(lsthme, shell=True) 

    def add_both(self): 

     # create a list and a file object for the file 
     lstOne = [] 
     fila = open('HomeList.txt', 'r') 

     # iterate over each line of the file and store the 
     # data into the each index of the list 
     for line in fila: 
      a = line.strip("\n") 
      lstOne.append(a) 

     # close the file 
     fila.close() 

     # return the list 
     return lstOne 

class HomePrint(): 

    # intialize the class, pass the list as lstAlpha 
    def __init__(self, lstAlpha=None): 
     # to keep the bounds of the list, which will initialize 
     # the list an empty list before the content of the list 
     # being passed as an argument 
     if lstAlpha is None: 
      lstTwo = [] 
     self.lstTwo = lstAlpha 
    def print_lst(self): 
     for line1 in self.lstTwo: 
      print(line1) 

def main(): 

    # create an object out of the first class 
    x = LstHome() 

    # call the lsthome() function in 
    # order to execute the command givenper 
    x.lsthome() 

    # assign and create an object out of the HomePrint class 
    # pass the output of the add_both() function from 
    # the LstHome() class 
    y = HomePrint(x.add_both()) 
    y.print_lst() 

    # an exit statement to the user 
    print 'The $HOME directory of the user has been printed\ndone.' 

main() 

私が代わりにHomeList.txtファイルに出力をリダイレクトするの、私の最初のクラスの機能でcall(lsthme, shell=True)を割り当てることができる方法はありますか?ですから、本質的に私はコードを書くことができます:

lsthme = 'ls $HOME' 
holdVar = call(lsthme, shell=True) 
print(holdVar) 

上記は合法的な議論ですか?そしてもしそうでなければ、私は何をしようとしているようなものに類似の結果を生み出すでしょうか?あなたがPopenでcallメソッドを置き換える可能性があるのPython

#! /usr/bin/python 

from subprocess import PIPE, Popen, call 

# This listHome.py program has been designed and created to 
# demonstrate a multi-class program that has a class receive 
# an array/list as a parameter, and demonstrates interacting with a 
# Unix shell with a multi-class program 
# author:oOpSgEoW 

class LstHome: 

    def lsthome(self): 
     # create the argument that will be passed to the call function 
     # Use the Popen function of subprocess 
     lsthme = Popen("ls $HOME", shell=True, stdout=PIPE) 

     # assign the function to lstOne 
     lstOne = lsthme.stdout.read().split('\n') 
     # now that the data has been stored, the Pipe must be closed 
     # NOTE: Generally speaking, what goes up must come down. What lives, must die. What opens must eventually close. 
     lsthme.stdout.close() 

     # return the lstOne object. 
     return lstOne 

class HomePrint(): 

    # intialize the class, pass the list as lstAlpha 
    def __init__(self, lstAlpha=None): 
     # to keep the bounds of the list, which will initialize 
     # the list an empty list before the content of the list 
     # being passed as an argument 
     if lstAlpha is None: 
      lstTwo = [] 
     self.lstTwo = lstAlpha 

    def print_lst(self): 
     for line1 in self.lstTwo: 
     # NEVER PASS A NEWLINE RETURN TO THE CALL FUNCTION, 
     # AT THE END OF AN ARGUMENT, just in case you wanted to 
     # to take the output, or some of the output, and use as a 
     # command line input. For example: 
     # if ".py" in line1: 
     # line2 = line1.strip('\n') 
     # mover = 'mv ' 
     # newmov = ' $HOME/Documents/Examples_In_Py/' 
     # doTheMov = mover + line2 + newmov 
     # call(doTheMov, shell=True) 
     print(line1) 

def main(): 

    # create objects by performing class and functional abstraction 
    x = LstHome() 
    x.lsthome() 
    # pass the list as an argument 
    y = HomePrint(x.lsthome()) 
    y.print_lst() 

    print 'The $HOME directory of the user has been printed\ndone.' 

main() 

答えて

3

に関するトピックを必要としている他の人のための正しい例:

おかげ


EDITED!

あなたのコードは最後に、このようsomenthingになります。

from subprocess import PIPE, Popen 

res = Popen("ls $HOME",shell=True, stdout=PIPE) 
home_list = res.stdout.read().split('\n') 

と、あなたは単にsubprocess.runを使用することができ、Pythonの3.5で、ホームフォルダ

+0

PIPEは自動的に終了しますか?例えば、home_listへの代入後に 'stdout.close()'と似たステートメントが必要なのです。var – oOpSgEo

+0

これについてはわかりません。ドキュメントでは、そのようなものは何も指定していません。あなたがそれを消費した後(EOFまで読む)、バッファが空になるファイルは、標準ストリームからのコピーではないことに留意してください。 – Rollback

0

のリストを持っています。

import subprocess 
output_bytes = subprocess.run("dir", shell=True, stdout=subprocess.PIPE).stdout 
+0

私は古い学校です(自分の好み)。今、単に2.6+。実際には今、ここ数ヶ月間、私は ':〜] $ python --version'という出力を得て、次の出力を得ています: ' Python 2.7.10.0' – oOpSgEo

関連する問題