Как запустить сценарий Python, который принимает аргументы командной строки из другого сценария Python, который я пишу?

У меня есть скрипт Python 3, который выглядит так:

  ...

  def main():
    parser = argparse.ArgumentParser(description='Perform normalisation checks on pass2 files')
    parser.add_argument('-p', '--parser', action='store', help='parser_code.', default = "")
    parser.add_argument('-m', '--midnight', help='start of day '
                        'in ns UTC', type=int, default=0)

    parser.add_argument('file', help='File to validate')
    args = parser.parse_args()

    rc = ReturnCode.SUCCESS

    rc = do_checks(args.file, args.midnight, args.parser)
    print(f"Validation completed with status: {rc}")

    exit(rc)

if __name__ == '__main__':
    main()

Обычно я запускаю этот скрипт в командной строке, передавая имя файла в качестве аргумента, что-то вроде:

python3 /util/check_normalisation.py -p lse /home/pchong/work/algotick/new_lob/pass2/01/97756_20240701.h5

Однако теперь у меня есть каталог, полный файлов (тысячи файлов), для которых я хотел бы запустить этот сценарий.

И мне сложно «запустить этот сценарий» из другого сценария, который я создаю. Можно ли сделать это?

Вот схема моего сценария:

    directory = '<path_to_directory_with_files_I_would_like_to_run_script_against'
 
    for file in os.listdir(directory):
        filename = os.fsdecode(file)

        run_the_above_script(filename)  # this is where I don't know what to do to run the command line python script

Взгляните на модуль подпроцесса

SIGHUP 27.07.2024 09:17

Почему бы не создать оригинальную функцию main, которая будет принимать аргументы и использовать argparse только для подачи этих аргументов if __name__ == '__main__'?

Ignatius Reilly 27.07.2024 09:18

Попался, не подумал об этом. Спасибо. Единственное, что если у меня тысячи файлов, я бы передал все эти имена файлов в качестве аргументов?

user21641220 27.07.2024 12:48

Вы передаете эти аргументы (например, filename) в цикл for: желаемый run_the_above_script(filename) станет main(filename) (возможно, с лучшим именем). Таким образом, ваш оригинальный скрипт может работать как модуль, так и как отдельная программа.

Ignatius Reilly 27.07.2024 20:32
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я предлагаю улучшить ваш скрипт, чтобы он мог принимать несколько файлов и последовательно делать то, что он должен делать. Вы можете использовать nargs='+' в argparse, чтобы выразить одно или несколько, рассмотрите следующий простой пример: пусть fnprinter.py будет

import argparse
parser = argparse.ArgumentParser(description = "Filenames printer")
parser.add_argument("--prefix", help = "will be printed before each filename", default = "")
parser.add_argument("files", help = "filenames", nargs = "+")
args = parser.parse_args()
for file in args.files:
    print(args.prefix, file)

затем

python fnprinter.py --prefix foobar file1.txt file2.txt file3.txt

дает результат

foobar file1.txt
foobar file2.txt
foobar file3.txt

Хотя ваше предложение является улучшением исходной конструкции, оно не отвечает на вопрос.

SIGHUP 27.07.2024 09:26

Спасибо за это! Я вижу здесь улучшение дизайна. Единственное, если у меня тысячи файлов, я не знаю, как их передать, если не наберу каждый вручную.

user21641220 27.07.2024 12:50
Ответ принят как подходящий

Для этого вы можете использовать subprocess.run. Пример:

import subprocess

subprocess.run(["python", "script_name.py", "arg1", "arg2", ...])

Вы можете ознакомиться с документацией по управлению подпроцессами Python здесь.

Другие вопросы по теме