有没有人知道如何在Python中从字符串转换为布尔值?我找到了这个链接.但它看起来不是一个正确的方法.即使用内置功能等.
我问这个的原因是因为我int("string")从这里学到了.我试过bool("string")但总是得到True.
>>> bool("False")
True
Run Code Online (Sandbox Code Playgroud) 我有一个脚本,它具有某些选项,可以在命令行上传递,也可以从环境变量传递.如果两者都存在,则CLI应该优先,如果两者都没有,则会发生错误.
我可以检查解析后是否分配了该选项,但我更喜欢让argparse执行繁重的工作并负责在解析失败时显示用法语句.
我已经提出了几种替代方法(我将在下面作为答案发布,以便可以单独讨论),但他们觉得我很笨,我认为我错过了一些东西.
是否有一种被接受的"最佳"方式?
(编辑以在未设置CLI选项和环境变量时清除所需的行为)
这是最简单的Python脚本,名为test.py:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--bool', default=True, type=bool, help='Bool type')
args = parser.parse_args()
print(args.bool)
Run Code Online (Sandbox Code Playgroud)
但是当我在命令行上运行此代码时:
python test.py --bool False
True
Run Code Online (Sandbox Code Playgroud)
而当我的代码读取时'--bool', default=False,argparse正确运行.
为什么?
我正在尝试编写一个函数wo,你可以通过argparse解析可变数量的参数 - 我知道我可以通过这个来做nargs="+".遗憾的是,argparse帮助的工作方式(以及人们通常在CLI中编写参数的方式)将位置参数放在最后.这导致我的位置参数被捕获为可选参数的一部分.
#!/usr/bin/python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("positional", help="my positional arg", type=int)
parser.add_argument("-o", "--optional", help="my optional arg", nargs='+', type=float)
args = parser.parse_args()
print args.positional, args.optional
Run Code Online (Sandbox Code Playgroud)
运行此以./test.py -h显示以下使用说明:
usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] positional
Run Code Online (Sandbox Code Playgroud)
但如果我跑./test.py -o 0.21 0.11 0.33 0.13 100了就给我
test.py: error: too few arguments
Run Code Online (Sandbox Code Playgroud)
为了正确解析args,我必须运行 ./test.py 100 -o 0.21 0.11 0.33 0.13
那么我该怎么做:
make argparse重新格式化使用输出,以免误导,或者甚至更好:
-o如果它是列表中的最后一个,则告诉argparse不捕获可选参数的最后一个元素
?
我试图使用argparse模块使我的Python程序接受灵活的命令行参数.我想传递一个简单的布尔标志,并在我的代码中说True或False执行适当的分支.
考虑以下.
import argparse
parser = argparse.ArgumentParser(prog='test.py',formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('-boolflag', type=bool, default=True)
parser.add_argument('-intflag' , type=int, default=3)
args = parser.parse_args()
boolflag = args.boolflag
intflag = args.intflag
print ("Bool Flag is ", boolflag)
print ("Int Flag is ", intflag)
Run Code Online (Sandbox Code Playgroud)
当我尝试执行它时,python scrap.py -boolflag False -intflag 314我得到了结果
Bool Flag is True
Int Flag is 314
Run Code Online (Sandbox Code Playgroud)
为什么是这样?!!似乎正确解析了intflag,但是布尔标志总是被解析为True即使我在命令行参数中明确提到我想要它False.
我哪里错了?
我正在尝试制作这样的构建脚本:
import glob
import os
import subprocess
import re
import argparse
import shutil
def create_parser():
parser = argparse.ArgumentParser(description='Build project')
parser.add_argument('--clean_logs', type=bool, default=True,
help='If true, old debug logs will be deleted.')
parser.add_argument('--run', type=bool, default=True,
help="If true, executable will run after compilation.")
parser.add_argument('--clean_build', type=bool, default=False,
help="If true, all generated files will be deleted and the"
" directory will be reset to a pristine condition.")
return parser.parse_args()
def main():
parser = create_parser()
print(parser)
Run Code Online (Sandbox Code Playgroud)
然而,无论我如何尝试传递参数,我都只能得到默认值。我总是得到Namespace(clean_build=False, clean_logs=True, run=True)。
我努力了:
python3 build.py --run False …Run Code Online (Sandbox Code Playgroud) 我想在应用程序中编写一个参数,其中我要调用的参数需要在initial_run设置为的脚本的第一次迭代/运行中引用True。否则,此值应保留为false。现在,此参数已在配置文件中配置。
我编写的当前代码如下。在此代码中应更改什么以返回True值?现在,它仅返回值False。
import sys
# main
param_1= sys.argv[0:] in (True, False)
print 'initial_run=', param_1
Run Code Online (Sandbox Code Playgroud) 我正在尝试获得以下行为:
当我使用时有效
parser.add_argument('--foo',nargs='?', default=False, const=True)
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加type=bool,则尝试将强制转换为布尔值会中断。在这种情况下
python test.py --foo False
Run Code Online (Sandbox Code Playgroud)
实际最终存储foo=True。这是怎么回事??
我正在使用argparse管理命令行选项,我想管理两个选项,--check和--nocheck.我实际上在做这样的事情mybadscript.py:
[...]
args = parser.parse_args()
if args.check:
check = True
if args.nocheck:
check = False
[...]
Run Code Online (Sandbox Code Playgroud)
问题是如果以这种方式启动脚本:
python mybadscript.py --nocheck --check
check将被设置为False.这是不正确的,因为最后一个选项是--check.
我该如何正确管理它们?
PS:我知道你只需要一个选项就可以轻松避免它,但我知道如何管理选项优先级argparse,因为你可以在更复杂的场景中遇到它.
PPS:建议的答案偶然回答了我的问题,但相关问题并不相同.
我有一个默认Luigi设置为True的布尔参数的任务:
class MyLuigiTask(luigi.Task):
my_bool_param = luigi.BoolParameter(default=True)
Run Code Online (Sandbox Code Playgroud)
当我从终端运行此任务时,有时我想将该参数作为False传递,但得到以下结果:
$ MyLuigiTask --my_bool_param False
error: unrecognized arguments: False
Run Code Online (Sandbox Code Playgroud)
显然对于false和0...
我知道我可以将默认设置为False,然后--my_bool_param如果我想设置为True,则使用该标志,但我更喜欢使用默认值True。
有什么办法可以做到这一点,并且仍然从终端传递False?
python ×10
argparse ×6
arguments ×1
boolean ×1
command-line ×1
luigi ×1
python-2.7 ×1
python-3.x ×1
string ×1
terminal ×1