我有一个python脚本,它被打包为命令行脚本(Pyrseas中的dbtoyaml.py,因为你问)。
我正在运行另一个我要调用此脚本的python脚本。有没有办法导入模块并从我的第二个脚本中人工填充所需的参数,以避免更改任何pyrseas代码?
from pyrseas import dbtoyaml
-- My initial script, which also takes arguments
dbtoyaml.main(['-m','-H MYHOSTNAME' .... other options])
Hasn还没为我工作。
我收到一个奇怪的错误:
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的双重参数吗?
答案 0 :(得分:12)
当我编写命令行脚本时,我经常会专门设计我的脚本,所以这是可能的。关键是将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
,然后导入脚本。虽然这可能会让人感觉不舒服,但它应该比打开一个新进程并单独调用命令要少得多。
答案 1 :(得分:6)
这似乎不是最好的方法,但你可以设置sys.argv
import sys
sys.argv += ['-m','-H MYHOSTNAME' .... other options]
from pyrseas import dbtoyaml
dbtoyaml.main()
但实际上我不知道dbtoyaml.py看起来像什么或是