与两个连接的 python3 脚本一起使用时的 argparse 冲突

Posted

技术标签:

【中文标题】与两个连接的 python3 脚本一起使用时的 argparse 冲突【英文标题】:argparse conflict when used with two connected python3 scripts 【发布时间】:2019-09-13 17:40:24 【问题描述】:

我正在尝试运行一个应该获取 argparse 标志的 python 脚本(Main_Script),并且该脚本同时调用另一个脚本(Sub_Script),该脚本也应该获取要输入的标志。当我调用 Main_Script 时,我收到一个错误,说我不能使用该标志,因为它没有在脚本中定义,但它实际上是定义的。错误通知让我使用下标中的标志。

主脚本

parser = argparse.ArgumentParser(add_help=True)
parser.add_argument('-p', '--print_positive_results', action='store_true')
args = parser.parse_args()

PRINT_POSITIVE = args.print_positive_results
#I then use rhi global variable PRINT_POSITIVE 

SUB_SCRIPT

import argparse
parser = argparse.ArgumentParser(add_help=True)
parser.add_argument('-d', '--debug', action='store_true')
args = parser.parse_args()

当我打电话给python MAIN_SCRIPT.py -p 时,我明白了

usage: test_grammar.py [-h] [-d]
test_grammar.py: error: unrecognized arguments: -p

DEBUG = False
if (args.debug ):
    DEBUG = True

【问题讨论】:

test_grammar.py“MAIN_SCRIPT”还是“SUB_SCRIPT”? 您的调用指令 python MAIN_SCRIPT.py -p 与程序的输出不匹配:test_grammar.py: error: ... 所以您可能不会调用包含主脚本的模块。 每个活动的解析器看到相同的sys.argv。要么编写它们,以便它们可以接受彼此的论点(parse_known_args 可以提供帮助),要么将它们设置为只运行一个解析器。将解析放在 if __name__ 块中会阻止解析 import test_grammar 是下标 【参考方案1】:

似乎主脚本中的命令行参数被传递到子脚本。

您可以尝试(并且可能应该)将 argparse 内容包装到:

if __name__ == '__main__':
    <argparse stuff>

这样,只有在从命令行调用脚本时才会调用代码。真正的代码可以外包到一个函数中。这样你就可以在命令行中使用带有 argparse 的脚本,并且只有在你从另一个脚本中调用它时才从脚本中导入函数:

主脚本:

import argparse
import subscript

if __name__ == '__main__':
    parser = argparse.ArgumentParser(add_help=True)
    parser.add_argument('-p', '--print_positive_results', action='store_true')
    args = parser.parse_args()

    ...
    subscript.your_function(<whatever your args are>)
    ...

子脚本:

import argparse


def your_function(<your args>):
    <your code>


if __name__ == '__main__':
    parser = argparse.ArgumentParser(add_help=True)
    parser.add_argument('-d', '--debug', action='store_true')
    args = parser.parse_args()

    your_function(<whatever your args are>)
    ...

【讨论】:

以上是关于与两个连接的 python3 脚本一起使用时的 argparse 冲突的主要内容,如果未能解决你的问题,请参考以下文章

将命名管道与后台进程一起使用时的不同行为

与 ? 一起使用时的逗号运算符优先级: 运算符 [重复]

将 MySQL 连接器与 Python 一起使用时出现 SSL 连接错误

python2与python3共存时的pip问题

同时安装py2与py3时的pip使用问题

创建数据库时的 H2 文件嵌入模式运行脚本(未初始化连接)