在for循环之后调用子进程在python中完成

时间:2017-11-06 22:27:00

标签: python for-loop subprocess

我有python脚本,如下所示。在此脚本中,我将收集脚本中的stdoutstderr文件并存储在Linux中。

在这个脚本中,我在path_finder的循环中运行函数input_file 在此脚本中,我使用subprocessLinux中的数据移至其他位置。

我想在完成subprocess之后运行loop调用,而是在loop第一次运行时以及第二次运行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

如何更改我的脚本,以便在sub process完成后运行for loop来电?

1 个答案:

答案 0 :(得分:1)

我不知道问题所在。您最后要执行的语句当前存在于函数' path_finder'这就是每次都在运行的原因。 要使此运行只运行一次,并且在for循环结束后,将语句放在它之后。

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

这应该这样做。