python mrjob: игнорировать нераспознанные аргументы

Обычно, если я хочу определить параметр командной строки для mrjob, я должен сделать так:

class Calculate(MRJob):
    def configure_args(self):
        super(Calculate, self).configure_args()
        self.add_passthru_arg("-t", "--time", help="output folder for time")

Когда я хочу использовать аргумент, мне просто нужно вызвать self.options.time, но он работает только внутри этого класса.

Я хочу отслеживать время mrjob и записывать время в файл json вот так cal.py:

from datetime import datetime
import json
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-t", "--time", help = "Output file")
args = parser.parse_args()

class Calculate(MRJob):
    ...

start_time = datetime.now()
Calculate.run()
execute_time = (datetime.now() - start_time).total_seconds()

data = {}
data["step1"] = execute_time
with open(args.time+'/time.json', 'w') as outfile:
    json.dump(data, outfile)

Когда я запускаю эту команду:

python cal.py data/input/input.txt --output data/output --time data/output

Я получил эту ошибку:

usage: cal.py [-h] [-t TIME]
cal.py: error: unrecognized arguments: data/input/input.txt --output data/output

Затем я нашел ответ об использовании parse_known_args() и попробовал:

args, unknown = parser.parse_known_args()

Теперь у меня появилась новая ошибка. Я полагаю, что это из mrjob, потому что я удалил argparse и запустил ту же команду, она возвращается точно так же:

usage: cal.py [options] [input files]
cal.py: error: unrecognized arguments: --time data/output

Как я могу определить аргумент, не затрагивая класс mrjob?


person huy    schedule 16.05.2021    source источник
comment
Если mrjob имеет собственный синтаксический анализатор, координировать аргументы командной строки сложно.   -  person hpaulj    schedule 16.05.2021
comment
@hpaulj да, верно, поэтому мне нужно снова определить аргументы внутри класса mrjob, чтобы он игнорировал argparse.   -  person huy    schedule 16.05.2021


Ответы (1)


Я нашел обходное решение, но я надеюсь, что будет лучший способ сделать это.

Мне нужно снова определить аргумент внутри класса mrjob, чтобы он мог его распознать:

from datetime import datetime
import json
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-t", "--time", help = "Output file")
args, unknown = parser.parse_known_args()

class Calculate(MRJob):
    def configure_args(self):
        super(Calculate, self).configure_args()
        self.add_passthru_arg("-t", "--time", help="output folder for time")

start_time = datetime.now()
Calculate.run()
execute_time = (datetime.now() - start_time).total_seconds()

data = {}
data["step1"] = execute_time
with open(args.time+'/time.json', 'w') as outfile:
    json.dump(data, outfile)

И запустите с помощью этой команды:

python cal.py data/input/input.txt --output data/output --time data/output
person huy    schedule 16.05.2021