2017-05-22 5 views
0

私は引数を取り、それらの引数に基づいてコマンドを実行する単純なスクリプトを持っています。各コマンドの出力はファイルに保存され、最後にファイルを圧縮します。それは、コマンドの完全な出力を伴うファイルを作成しますが、ファイルを圧縮するとき、ファイル全体を入れません。それは最初の行をキャプチャし、それはすべてです。最初のファイルは問題なく入ります。作成する各Popenオブジェクトに対してPython ZipFileがテキストファイルの一部を圧縮しています

#!/usr/bin/python 

import sys 
import os 
import subprocess 
from zipfile import ZipFile 

filenames = [] 

def zip(): 
with ZipFile('zippity.zip', 'w') as zip: 
    for file in filenames: 
     zip.write(file) 


def command(cmd, arg, banner, filename, i): 
    ban = '------------' + banner + '-------------\n' 
    if i.islower(): 
     filenames.append(filename) 
     f = open(filename, 'w') 
     f.write(ban) 
     if arg == '': 
      subprocess.Popen(cmd, stdout=f) 
     else: 
      subprocess.Popen([cmd, arg], stdout=f) 
     f.close() 
    elif i.isupper(): 
     filenames.append(filename) 
     print '------------' + banner + '-------------' 
     os.system(cmd) 
     print('\n') 
     f = open(filename, 'w') 
     f.write(ban) 
     if arg == '': 
      subprocess.Popen(cmd, stdout=f) 
     else: 
      subprocess.Popen([cmd, arg], stdout=f) 
     f.close() 


def menu(): 
    print('System Survey v1.0\n' + 
      'Usage: ' + sys.argv[0] + ' [OPTIONS]\n' + 
      'Example: ' + sys.argv[0] + ' -a -i -r -b\n' + 
      'Description: Lowercase will create file and not display to screen. \n' + 
      'Uppercase will display and save to file.\n\n' + 
      '----[OPTIONS]----\n' + 
      '-i   ifconfig -a\n' + 
      '-r   route\n' + 
      '-w   whoami\n') 


for i in sys.argv: 
    if len(sys.argv) == 1: 
     menu() 
     break 
    if i == '--help': 
     menu() 
     break 
    elif i == '-i' or i == '-I': 
     command('ifconfig', '-a', 'IFCONFIG', 'ifconfig.txt', i) 
    elif i == '-r' or i == '-R': 
     command('route', '', 'ROUTE', 'route.txt', i) 
    elif i == '-w' or i == '-W': 
     command('whoami', '', 'WHOAMI', 'whoami.txt', i) 
    elif i == sys.argv[0]: 
     continue 
    else: 
     print(sys.argv[0] + ': option not recognized.') 
     print(sys.argv[0] + ': --help gives usage information.') 

zip() 

答えて

0

ファイルをアップビュン開始する前に、プロセスが完了するように、あなたはそれにwaitメソッドを呼び出す必要があります。

process = subprocess.Popen(cmd, stdout = f) 
process.wait() 
+0

大変助かりましたが、今ではバナー "------------ banner -----------"が各出力の最後に印刷されています。 – sqlsqlsql

+0

それは別の質問のように聞こえる。 –

関連する問題