0

私はすでに尋ねましたが、良いアドバイスをくれる人はほとんどいませんでしたが、初心者の私には不明な点がたくさんありました. したがって、悪いコードを提供せずに、もう一度助けを求めることにしました。

他のファイルがまだ実行されている間に、ディレクトリへのファイルのコピーを実行するスクリプトが必要です。基本的に、最初のコマンドを実行すると、ファイルが生成され(ユーザーがEnterキーを押すまで)、それらのファイルはなくなります(自動的に削除されます)。
私がしたいのは、それらのファイルをコピーすることです(「Enter」を押す必要もありません)。私はbashで作成しましたが、Pythonでこれを実現したいと考えています。下記を参照してください:

while kill -0 $! 2>/dev/null;do
cp -v /tmp/directory/* /tmp/
done
4

1 に答える 1

0

最初のスクリプトが純粋なコマンド ラインの場合: Python スクリプトで完全に管理できるはずです。

一般的なアーキテクチャ:

  • Pythonスクリプトはsubprocessモジュールで最初のものを開始します
  • Enter キーを押すように求めるメッセージが表示されるまで、最初のスクリプトからの出力を読み取ります。
  • すべてのファイルをソース ディレクトリから宛先ディレクトリにコピーします
  • \r最初のスクリプト入力に送る
  • 最初のスクリプトが終了するのを待ちます
  • 出る

一般的な要件:

  • 最初のスクリプトは純粋に CLI である必要があります
  • 最初のスクリプトは、標準出力/エラーに書き込み、標準入力から読み取る必要があります -物理端末 ( /dev/ttyUnix/Linux またはcon:Dos/Windows) に対して読み取り/書き込みを行う場合、機能しません。
  • 処理の終了は、標準出力/エラーで識別可能でなければなりません
  • 上記の 2 つの要件が満たされない場合、唯一の方法は、定義された時間待機することです。

オプション操作:

  • 最初のスクリプトに他の相互作用 (読み取りおよび/または書き込み) がある場合、スクリプトにリダイレクトを追加する必要があります。確かに実行可能ですが、少し難しくなります。

構成 :

  • 実行するコマンド
  • 最初のプログラムが処理を終了したことを示す (コマンド出力からの) 文字列
  • ソースディレクトリ
  • 宛先ディレクトリ
  • コピーするファイル名のパターン
  • 時間が定義されていて、出力に識別可能な文字列がない場合: コピーする前に待機する遅延

このようなスクリプトは、作成とテストが簡単で、最初のスクリプトを必要に応じて管理できる必要があります。

編集:これはそのようなスクリプトの例ですが、タイムアウト管理はまだありません。

import subprocess
import os
import shutil
import re

# default values for command execution - to be configured at installation
defCommand = "test.bat"
defEnd = "Appuyez"
defSource = "."
defDest = ".."
# BEWARE : pattern is in regex format !
defPattern="x.*\.txt"

class Launcher(object):
    '''
Helper to launch a command, wait for a defined string from stderr or stdout
of the command, copy files from a source folder to a destination folder,
and write a newline to the stdin of the command.
Limits : use blocking IO without timeout'''
    def __init__(self, command=defCommand, end=defEnd, source=defSource,
                 dest=defDest, pattern = defPattern):
        self.command = command
        self.end = end
        self.source = source
        self.dest = dest
        self.pattern = pattern

    def start(self):
        'Actualy starts the command and copies the files'
        found = False
        pipes = os.pipe() # use explicit pipes to mix stdout and stderr
        rx = re.compile(self.pattern)
        cmd = subprocess.Popen(self.command, shell=True, stdin=subprocess.PIPE,
                               stdout=pipes[1], stderr=pipes[1])
        os.close(pipes[1])
        while True:
            txt = os.read(pipes[0], 1024)
            #print(txt) # for debug
            if str(txt).find(self.end) != -1:
                found = True
                break
        # only try to copy files if end string found
        if found:
            for file in os.listdir(self.source):
                if rx.match(file):
                    shutil.copy(os.path.join(self.source, file), self.dest)
                    print("Copied : %s" % (file,))
            # copy done : write the newline to command input
            cmd.stdin.write(b"\n")
        cmd.stdin.close()
        try:
            cmd.wait()
            print("Command terminated with %d status" % (cmd.returncode,))
        except:
            print("Calling terminate ...")
            cmd.terminate()
        os.close(pipes[0])

# allows to use the file either as an imported module or directly as a script
if __name__ == '__main__':
    # parse optional parameters
    import argparse

    parser = argparse.ArgumentParser(description='Launch a command and copy files')
    parser.add_argument('--command', '-c', nargs = 1, default = defCommand,
                        help="full text of the command to launch")
    parser.add_argument('--endString', '-e', nargs = 1, default = defEnd,
                        dest="end",
                        help="string that denotes that command has finished processing")
    parser.add_argument('--source', '-s', nargs = 1, default = defSource,
                        help="source folder")
    parser.add_argument('--dest', '-d', nargs = 1, default = defDest,
                        help = "destination folder")
    parser.add_argument('--pattern', '-p', nargs = 1, default = defPattern,
                        help = "pattern (regex format) for files to be copied")

    args = parser.parse_args()

    # create and start a Launcher ...
    launcher = Launcher(args.command, args.end, args.source, args.dest,
                        args.pattern)
    launcher.start()
于 2014-10-07T13:55:04.480 に答える