importar un script de Python desde otro script y ejecutarlo con argumentos

Tengo una secuencia de comandos de Python que se ha empaquetado como una secuencia de comandos de línea de comandos (dbtoyaml.py en Pyrseas desde que me preguntas).

Estoy ejecutando otro script de Python desde el que quiero llamar a este script. ¿No hay manera de importar el módulo y rellenar artificialmente los argumentos requeridos de mi segundo script para evitar cambiar el código de pyrseas?

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

Todavía no ha trabajado para mí.

Me sale un error extraño:

 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 

Que es una mezcla de mi nuevo script (checkSchemaChanges.py, MYHOSTNAME y mydatabaseuser en la parte inferior) y los parámetros de dbtoyaml, que son todos correctos.

¿Podría ser el doble conjunto de parámetros lo que confunde argparse?

Esto parece no ser la mejor manera de hacerlo, pero probablemente pueda configurar sys.argv

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

pero en realidad no tengo idea de lo que parece o es dbtoyaml.py

Cuando escribo un script de línea de comandos, muchas veces diseñaré específicamente mi script para que esto sea posible. La clave es analizar los argumentos separados de la función principal.

Por ejemplo, la función principal podría verse así:

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

Luego, en otra parte del módulo, configuraré el analizador arg, analizaré los argumentos y pasaré el resultado al script principal:

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

De esa manera, si alguien quiere llamar al script desde Python, puede hacerlo (también hace que las pruebas sean mucho más fáciles):

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

Desafortunadamente, parece que los autores del script que está utilizando no hicieron nada de eso. Como se indica en otra respuesta, puede sobrescribir sys.argv y luego importar el script. Si bien eso puede parecer complicado, debería ser menos intensivo en recursos que abrir un nuevo proceso y ejecutar el comando por separado.