argparse とマルチプロセッサを使用して Python でプログラムで 3 つのファイルを作成する

okwaves2024-01-24  6

私の目標は、次のコードを使用して、file_1.py file_2.py file_3.py という名前の 3 つのファイルを出力することです。

問題

ただし、引数として 100 と 3 を指定してgenerate_file(100,1) 関数を呼び出すと、次のエラーが表示されます。

エラー: 次の引数が必要です: num_files、num_lines

import random
import argparse
import multiprocessing


# Function to generate a file with the specified number of lines
def generate_file(num_lines, file_number):
    '''
    Function to generate a file with the specified number of lines, each with 3 random numbers
    '''
    filename = "file_" + str(file_number) + ".txt"

    # Open writer and output lines
    file = open(filename, "w")
    for i in range(num_lines):
        line = str(random.randint(0, 10)) + " " + str(random.randint(0, 10)) + " " + str(random.randint(0, 10))
        file.write(line + "\n")
    file.close()
    print(filename + " written!")

次に、このコードを使用して、プログラムで 3 つの個別のファイルを生成します。

def parse_arguments():
    '''
    Argument parser
    num_files = Number of files
    num_lines = Number of lines
    '''
    parser = argparse.ArgumentParser(description='Set the number of files and number of lines')
    parser.add_argument("num_files", type=int, help="Number of files to create")
    parser.add_argument("num_lines", type=int, help="Number of lines per file")
    args = parser.parse_args()
    return (args)


def main():
    '''
    Get arguments from func, setup multiprocessing, create files
    '''
    arguments = parse_arguments()
    num_files = arguments.num_files
    num_lines = arguments.num_lines
    print("Program arguments: num_files = " + str(num_files) + "; num_lines = " + str(num_lines))

    jobs = []
    for file_number in range(num_files):
        t = multiprocessing.Process(target=generate_file, args=(num_lines, file_number))
        jobs.append(t)
        t.start()  # new child process is started at this point, it has its own execution flow

    for curr_job in jobs:  # wait for all processes to finish
        curr_job.join()

    print("Program completed OK")


if __name__ == "__main__":
    main()

そして、関数を呼び出します。

#call function
generate_file(100, 3)

この Python スクリプトをどのように実行していますか?コマンドラインでスクリプトを実行してみましたが、d 引数が正しく解析されました: 例: 'python file.py 100 3'

– イメニナト

2020 年 9 月 3 日 14:29

@Imeninato ファイル内で関数を呼び出していました。例: 'generate_file(100,3)'ターミナル経由で実行するときにファイルに引数を与える方法と理由を説明できますか?言い換えれば、私はこのコードの一部をまったく理解していません。簡単な説明はとても助かります!ありがとう!

– d-dripz

2020 年 9 月 3 日 17:56



------------------------

マルチプロセッシングで生成されたプロセスは、if __name__ == '__main__' ガードを使用して呼び出す必要があります。詳細については、Python マルチプロセッシングのドキュメントを参照してください。

というラベルの付いたセクションを確認してください。

メインモジュールの安全なインポート

1

こちらこそありがとうございます!とても役に立ちました!

– d-dripz

2020 年 9 月 4 日 16:52

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。