比if uuu name uuu=='更好的解决方案__主&';在Python脚本中使用两次

比if uuu name uuu=='更好的解决方案__主&';在Python脚本中使用两次,python,docopt,Python,Docopt,我有多个使用docopt的Python脚本 我的问题是,两个脚本的可用选项略有不同——一个脚本中存在一个选项,但另一个脚本中没有 我在下面列出了一个最低限度的工作示例 如果我跑步: python main.py --num=7 --name=John 脚本没有运行,因为--name=John也被传递到module1.py,在module1.py中它不是一个有效的选项 对于我的实际脚本,在docopt解析参数之后,我有几个导入,因此我不能简单地将docopt调用移到脚本的底部(如果uuuu na

我有多个使用docopt的Python脚本

我的问题是,两个脚本的可用选项略有不同——一个脚本中存在一个选项,但另一个脚本中没有

我在下面列出了一个最低限度的工作示例

如果我跑步:

python main.py --num=7 --name=John
脚本没有运行,因为--name=John也被传递到module1.py,在module1.py中它不是一个有效的选项

对于我的实际脚本,在docopt解析参数之后,我有几个导入,因此我不能简单地将docopt调用移到脚本的底部(
如果uuuu name\uuuuuu=='uuuu main\uuu':
)。如果我这样做,导入脚本中的导入将永远不会被调用,并且会出现未定义的名称错误

我已经找到了一个解决办法,但我认为这根本不是一个好的做法

我所做的是补充:

if __name__ == '__main__':
    arguments = docopt.docopt(__doc__, version=0.1)
就在
导入docopt
之后

然而,我认为在一个脚本中有两个这样的语句是不好的做法。不过,目前我想不出任何其他解决办法

有人能提出更好的解决方案吗?提前谢谢

main.py

"""
main.py

Usage:
    main.py [--num=<num>] [--name=<name>] [--lib=<lib-dir>]
    main.py -h | --help
    main.py --version

Options:
    --num=<num>  A number
    --name=<name>  A name
    --lib=<lib-dir>  Path to the directory containing lib
    --version
"""
import docopt

arguments = docopt.docopt(__doc__, version=0.1)
library_path = os.path.abspath(arguments['--lib'])
sys.path.insert(1, library_path)
NUM = arguments['--num']

from other_file import x, y


from module1 import function


def main():
    print 'In main()'
    function()
    print NUM


if __name__ == '__main__':
    print '{} being executed directly'.format(__name__)
    main()
因此,需要在全局范围内导入docopt,以便将另一个_文件模块的路径添加到我的系统路径中


全局变量(下面的NUM,在我的实际文件中调试)我可以不使用。

干净的解决方案是重构代码,使其不依赖全局变量,无论是在
main.py
还是
module1.py

"""
main.py

Usage:
    main.py [--num=<num>] [--name=<name>]
    main.py -h | --help
    main.py --version

Options:
    --num=<num>  A number
    --name=<name>  A name
    --version
"""
from other_file import x, y
from module1 import function


def main(num):
    print 'In main()'
    function(num)
    print num


if __name__ == '__main__':
    import docopt

    arguments = docopt.docopt(__doc__, version=0.1)
    NUM = arguments['--num']

    print '{} being executed directly'.format(__name__)
    main(NUM)
“”“
main.py
用法:
main.py[--num=][--name=]
main.py-h |--帮助
main.py--版本
选项:
--num=一个数字
--名字=名字
--版本
"""
从其他_文件导入x,y
从module1导入函数
def主(数量):
打印“在main()中”
函数(num)
打印数
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入docopt
参数=docopt.docopt(uuu doc_uuuuu,版本=0.1)
NUM=参数['--NUM']
打印正在直接执行的“{}”。格式(_name__;)
主要(数量)
以及:

“”“
模块1.py
用法:
module1.py[--num=]
module1.py-h |——帮助
module1.py—版本
选项:
--num=一个数字
--版本
"""
从其他_文件导入z
def主(数量):
打印“在main()中”
打印数
def功能(num):
以{}格式打印函数中的
打印数
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入docopt
参数=docopt.docopt(uuu doc_uuuuu,版本=0.1)
NUM=参数['--NUM']
打印正在直接执行的“{}”。格式(_name__;)
主要(数量)

为什么不能将所有可能的内容都放在
main()
中?参数应该在从命令行调用的脚本中处理。模块不应读取或处理命令行参数。更改您的模块以接受主脚本解析的参数。我更新了我的问题,因为我忘记了我的最小工作示例中的一个关键点。我需要将
其他_文件的路径添加到我的系统路径中。如果我在
中这样做,如果uuuu name\uuuuu=='\uuuuu main\uuuuuu'
,那么该模块的导入也必须在这里。如果在这两个模块中都导入了
other_文件
,那么它将永远不会在一个模块中导入,这将导致我的未定义名称错误。@Andomar我同意。我不希望任何其他模块处理命令行参数,但是,通过导入docopt并在两个模块中使用
arguments=docopt.docopt(\uu doc\uu,version=0.1)
,两个模块都将尝试解析参数。我在更新的问题中概述了在全球范围内使用这一行的原因。
library_path = os.path.abspath(arguments['--lib'])
sys.path.insert(1, library_path)
"""
main.py

Usage:
    main.py [--num=<num>] [--name=<name>]
    main.py -h | --help
    main.py --version

Options:
    --num=<num>  A number
    --name=<name>  A name
    --version
"""
from other_file import x, y
from module1 import function


def main(num):
    print 'In main()'
    function(num)
    print num


if __name__ == '__main__':
    import docopt

    arguments = docopt.docopt(__doc__, version=0.1)
    NUM = arguments['--num']

    print '{} being executed directly'.format(__name__)
    main(NUM)
"""
module1.py

Usage:
    module1.py [--num=<num>]
    module1.py -h | --help
    module1.py --version

Options:
    --num=<num>  A number
    --version
"""
from other_file import z


def main(num):
    print 'In main()'
    print num


def function(num):
    print 'In function in {}'.format(__name__)
    print num


if __name__ == '__main__':
    import docopt

    arguments = docopt.docopt(__doc__, version=0.1)
    NUM = arguments['--num']

    print '{} being executed directly'.format(__name__)
    main(NUM)