импорт скрипта 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
, затем импортируйте скрипт. Хотя это может показаться хакерским, это должно быть менее ресурсоемким, чем открытие нового процесса и вызов команды отдельно.