从具有位置命令行参数的Python模块导入函数

时间:2014-09-12 10:29:15

标签: python import command-line-arguments

我有一个Python(3.4)模块(称为'file_1.py'),它使用位置命令行参数(使用argparse)并对此参数执行函数:

# set up command line parser
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('n', '--number', type=int, required=True, help='some number')

# read command line argument
args = parser.parse_args()
parsed_number = args.number

# function to do some math
def add_one_to_number(x)
    return x+1

# use the function
print(add_one_to_number(parsed_number))

现在,从另一个模块('file_2.py')导入和调用该函数时,

from file_1 import add_one_to_number
print(add_one_to_number(1))

我收到错误file_2: error: the following arguments are required: -n/--number

我知道发生这种情况是因为导入的代码在使用import语句后执行,因此请求位置命令行参数。但是,有没有办法导入函数而不以任何方式将位置命令行参数传递给file_1?背景是我想对函数进行一些单元测试,据我所知,测试像我的函数这样的代码单元不应该依赖于传递的命令行参数。

1 个答案:

答案 0 :(得分:2)

为防止代码在导入模块时运行,通常会定义main()入口点函数并在调用之前测试脚本是否正在直接运行:

if __name__ == "__main__":
    main()

在你的情况下,你可以这样做:

import argparse

def parse_args():
    """Parse command line arguments."""
    parser = argparse.ArgumentParser()
    parser.add_argument('n', '--number', type=int, required=True, 
                        help='some number')
    return parser.parse_args()

def add_one_to_number(x):
    """Function to do some math."""
    return x + 1

if __name__ == "__main__":
    args = parse_args()
    print(add_one_to_number(args.number))

现在你可以import这两个函数而不必运行它们。