2017-11-06 9 views
0

私はpythonスクリプトを以下のように持っています。このスクリプトでは、スクリプトのstdoutstderrをファイルに収集し、Linuxに保存しています。このスクリプトでforループの後にサブプロセスを呼び出すのは、Pythonで完了します

、私は別の場所にLinuxでデータを移動するsubprocessを使用しています、このスクリプトでinput_file にわたるループに機能path_finderを実行しています。

私はloop代わりを終えた後に実行するには、このsubprocessコールをしたい、それが期待されているエラーをスローするときloop初めて実行すると、ときに、第2の時間loop実行実行されます。ファイルが存在するので、エラーが発生します。

#!/usr/bin/python 

import os 
import sys 
import traceback 
import subprocess 

def path_finder(
    table, 
    mysql_user, 
    user, 
    dir, 
    ): 


    day = datetime.now().strftime('%Y-%m-%d') 
    month = datetime.now().strftime('%Y-%m') 

    Linux_path = '/data/logging/{}'.format(input_file) 
    New_path = '/user/{}/{}/logging/{}/{}/{}'.format(user,dir,mysql_user,month,day) 

    subprocess.call(["rm", Linux_path]) 

    so = se = open('/data/logging/{}'.format(input_file), 'a', 
        0) 

    #re-open stdout without buffering 
    sys.stdout = os.fdopen(sys.stdout.fileno(), 'a', 0) 

    # redirect stdout and stderr to the log file opened above 
    os.dup2(so.fileno(), sys.stdout.fileno()) 
    os.dup2(se.fileno(), sys.stderr.fileno()) 

    ### CODE: 

    Do something 

    ### if errors the print traceback 

    ### repeat the same for every table in input file 

    ## Execute below statement after for loop completed 

    subprocess.call(["cp", Linux_path, New_path]) 


if len(sys.argv) != 5: 
    print 'Invalid number of args......' 
    exit() 

input_file = sys.argv[1] 
mysql_user = sys.argv[2] 
user = sys.argv[3] 
dir = sys.argv[4] 

input = open("{}.format(input_file)", "r") 

for table in input: 
    path_finder(
      table, 
      mysql_user, 
      user, 
      dir, 
      ) 

sc.stop() 
print 

for loopが行われた後sub process呼び出しが実行されるようにどのように私は私のスクリプトを変更できますか?

答えて

1

問題の内容がわかりません。最後に実行したいステートメントは現在 'path_finder'という関数に存在しています。これは毎回実行されている理由です。 これを1回だけ実行し、forループが終了した後に、そのステートメントをその後ろに置きます。

for table in input: 
path_finder(
     table, 
     mysql_user, 
     user, 
     dir, 
     ) 
subprocess.call(["cp", Linux_path, New_path]) 

これはそれを行う必要があります。

関連する問題