импорт скрипта python из другого скрипта и его запуск с аргументами

у меня есть скрипт python, который был упакован как скрипт командной строки (dbtoyaml.py в Pyrseas раз вы спрашиваете).

Я запускаю другой скрипт python, из которого я хочу вызвать этот скрипт. Нет ли способа импортировать модуль и искусственно заполнить необходимые аргументы из моего второго скрипта, чтобы вообще не изменять код pyrseas?

from pyrseas import dbtoyaml -- My initial script, which also takes arguments dbtoyaml.main(['-m','-H MYHOSTNAME' .... other options])

еще не работал на меня.

Я получаю странные ошибка:

usage: checkSchemaChanges.py [-h] [-H HOST] [-p PORT] [-U USERNAME] [-W]
                         [-c CONFIG] [-r REPOSITORY] [-o OUTPUT]
                         [--version] [-m] [-O] [-x] [-n SCHEMA]
                         [-N SCHEMA] [-t TABLE] [-T TABLE]
                         dbname
checkSchemaChanges.py: error: unrecognized arguments: MYHOSTNAME mydatabaseuser

который является смесью моего нового скрипта (checkSchemaChanges.py, и MYHOSTNAME и mydatabaseuser внизу) и параметры из dbtoyaml, которые все верны.

это может быть двойной набор параметров, который сбивает с толку argparse?

2 ответов


это кажется не лучшим способом сделать это, но вы, вероятно, можете установить sys.аргв

import sys
sys.argv += ['-m','-H MYHOSTNAME' .... other options]
from pyrseas import dbtoyaml
dbtoyaml.main()

но на самом деле я понятия не имею, что dbtoyaml.py lookslike или


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

например, основная функция может выглядеть так:

def main(**kwargs):
    # the body of the script goes here

затем в другом месте модуля я настрою парсер arg, проанализирую args и передам результат в основной скрипт:

def run():
    parser = ... # configure parser here
    configs = parse_args(parser)
    main(**configs)

таким образом, если кто-то хочет вызвать скрипт из питона, они могут сделайте это (это также упрощает тестирование):

import somescript
somescript.main(option='value', option2='value2')

к сожалению, похоже, что авторы сценария, который вы используете, ничего подобного не делали. Как указано в другом ответе, вы можете перезаписать sys.argv, затем импортируйте скрипт. Хотя это может показаться хакерским, это должно быть менее ресурсоемким, чем открытие нового процесса и вызов команды отдельно.