2017-01-04 6 views
2

私はどこに行くべきかわからないところまでこれを打ちました。私はそれをset()メソッドに絞り込んだ。私はWindowsマシン上でこれを実行するとうまく動作します。しかし、それはLinux上で実行する必要があります。これを行うときには、何も変数に格納されません。linuxでの設定方法

これは、set()メソッドを使用するコードです。 Windowsマシンに

def three_way_compare(startup, running, archive): 
    isdiff = True 

    print "Running Three-Way Comparison." 

    if cmp(startup, archive) and cmp(running, archive) != 0: 
     print "Archive File(s) Missing:" 
     compareset = sorted(set(startup)^set(archive)) 
    elif cmp(startup, archive) != 0: 
     print "Startup File(s) Missing:" 
     compareset = sorted(set(startup)^set(archive)) 
    elif cmp(running, archive) != 0: 
     print "Running File(s) Missing:" 
     compareset = sorted(set(running)^set(archive)) 
    elif cmp(running, startup) != 0: 
     print "Running and Startup do not match" 
     compareset = sorted(set(running)^set(startup)) 
    else: 
     print "All Files Exist" 
     isdiff = False 
    if isdiff == True: 
     from sendmail import send_mail 
     #write_diff_file(compareset) 
     print compareset 

compareset変数店舗すべての異なる要素とそれが表示される。しかし、それはLinux上でない、ただ次のことを示します。ウィンドウで[]はすべての異なる要素で満たされます。スリーウェイの比較を実行

。スタートアップファイルが見つかりません:[]比較 完了しました。

任意の助けをいただければ幸いですので、私はまだプログラミングに新たなんです。ここで

は、Parseメソッドです。

def parse_files(directory): 
    results = [] 
    i = 0 
    l = len(os.listdir(directory)) 
    #os.chdir(directory) 
    try: 
     for filename in os.listdir(directory): 
      if filename.endswith(('.cfg', '.startup', '.confg')): 
       file_name = os.path.join(directory, filename) 
       with open(file_name, "r") as in_file: 
        for line in in_file: 
         match = re.search('^hostname\s(\S+)$', line) 
         if match: 
          results.append(match.group(1)) 
          #print "Match Found" 

      sleep(0.001) 
      i += 1 
      progress_bar(i, l, prefix = 'Progress:', suffix = 'Complete', barLength = 50) 
     return results 
    except IOError as (errno, strerror): 
     print "I/O error({0}): {1}".format(errno, strerror) 
     print "Error in parse_files function" 
+0

'!= 0 'とは何ですか?その必要はありません。ゼロ以外の値はすでに真です。 –

+0

私は、cmp()が異なる場合は1または-1を返し、同じ場合は0を返します。私は、もしcmpが同じでないならtrueを返すと言っていました。しかし、多分そのJavaで考える?私はまだ非常に新しいです。私は他にそれを正しくする方法を知らなかった。 – NineTail

+0

エラーが発生した行を示すスタックトレースを含め、完全なエラーを投稿してください。また、あなたの目標がこの機能のために何であるか教えてください。 –

答えて

1

は、私はより多くのトラブルシューティングで見つかった問題は、実際にREGEX式でした。私は^と$を取り出し、それは私の解析方法であり、ここでregex101を通じて

を、それを実行した後に働きました。

def parse_files(directory): 
    results = [] 
    i = 0 
    l = len(os.listdir(directory)) 
    #os.chdir(directory) 
    try: 
     for filename in os.listdir(directory): 
      if filename.endswith(('.cfg', '.startup', '.confg')): 
       file_name = os.path.join(directory, filename) 
       with open(file_name, "r") as in_file: 
        for line in in_file: 
         match = re.search('^hostname\s(\S+)$', line) 
         if match: 
          results.append(match.group(1)) 
          #print "Match Found" 

      sleep(0.001) 
      i += 1 
      progress_bar(i, l, prefix = 'Progress:', suffix = 'Complete', barLength = 50) 
     return results 
    except IOError as (errno, strerror): 
     print "I/O error({0}): {1}".format(errno, strerror) 
     print "Error in parse_files function" 

変更

match = re.search('hostname\s(\S+)', line) 
1

それがより良い書き込むことができるが、問題は、three_way_compare方法ではありません。この方法は、WindowsとLinuxで全く同じように動作します。

システムによっては、startuprunningarchiveという変数に異なるセット/リストを渡すのが問題だと思います。

print '%s, %s, %s' %(startup, running, archive) 

あなたはこれら3つのリストのデータを収集する方法を見てみてください:あなたはthree_way_compare方法の最初の行にこれらの3つの変数を印刷していることを確認することができます。私はあなたがstartuprunningarchiveリストのすべてのアイテムを収集するために、いくつかのWindows固有のシステム操作を使用していると思います。

+0

それは私が持っている解析メソッドとだ。私はこれが正しいと信じています。 – NineTail

+0

私は問題が正規表現にあると思います。いくつかのprintステートメントを追加しましたが、ファイルを開いていますが、一致するものは見つからないようです。これは奇妙です、私はLinux上で同じファイルをWindows上で使用しています。 – NineTail

関連する問題