比if uuu name uuu=='更好的解决方案__主&';在Python脚本中使用两次
我有多个使用docopt的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
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)