私の目標は、次のコードを使用して、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