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()
PIPEは自動的に終了しますか?例えば、home_listへの代入後に 'stdout.close()'と似たステートメントが必要なのです。var – oOpSgEo
これについてはわかりません。ドキュメントでは、そのようなものは何も指定していません。あなたがそれを消費した後(EOFまで読む)、バッファが空になるファイルは、標準ストリームからのコピーではないことに留意してください。 – Rollback