繁体   English   中英

从另一个脚本导入python脚本并使用参数运行它

[英]importing a python script from another script and running it with arguments

我有一个python脚本,它已被打包为命令行脚本(因为你问的问题,pyrseas中的dbtoyaml.py )。

我正在运行另一个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的双重参数吗?

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

例如,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 ,然后导入脚本。 虽然这可能会让人感觉不舒服,但与开启新进程并单独调用命令相比,它应该更少占用资源。

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

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

但实际上我不知道dbtoyaml.py看起来是什么样的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM