簡體   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