从另一个脚本导入 python 脚本并 运行 它带有参数

importing a python script from another script and running it with arguments

我有一个 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?

这似乎不是最好的方法,但您可以设置 sys.argv

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

但我真的不知道 dbtoyaml.py 是什么样子或者是什么

当我编写命令行脚本时,我经常会专门设计我的脚本,所以这是可能的。关键是要将 args 与 main 函数分开解析。

例如,主要功能可能如下所示:

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

然后在模块的其他地方我将配置 arg 解析器,解析 args 并将结果传递给主脚本:

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

这样,如果有人想从 Python 中调用脚本,他们就可以这样做(这也使测试更容易):

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

不幸的是,您使用的脚本的作者似乎没有做任何类似的事情。如另一个答案所述,您可以覆盖 sys.argv,然后导入脚本。虽然这可能会让人觉得很麻烦,但与打开一个新进程并单独调用命令相比,它应该占用更少的资源。