如何使用布尔参数运行Python文件

2024-10-01 04:58:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个.py文件,其中有一个函数,基本上将.csv文件转换为.pkl文件。从终端调用此文件时,应根据输入是否为真,在英制和公制之间转换测量值。比如说

python3 file.py imperial_units=Truepython3 file.py imperial_units=False如果没有提供像python3 file.py这样的参数,英制单位应该默认为True:

这是我的尝试:

import json, sys
import pandas as pd

def log_to_pickle(units):
    ...
            
            if units == True: # If units == True, convert all metric to imperial
                print('Imperial True')
                if imperial_unit == False:
                    ...

            elif units == False: # If units == False, convert all imperial to metric
                print('Imperial False')
                if imperial_unit == True:
                    ...

            ...

if __name__ == "__main__":
    if sys.argv == True or sys.argv == '':
        log_to_pickle(True)
    else:
        log_to_pickle(False)

我在if/elif块中添加了print语句,以查看输入是否有效。我运行了python3 file.py imperial_units=True,结果是'Imperial False'

我做错了什么


Tags: 文件topylogfalsetrueifsys
3条回答

sys.argv提供参数列表。您可以对其进行迭代以找到包含“英制单位”的参数。然后,您可以对其进行处理以获得布尔值

if __name__ == "__main__":
    #Find arguments which contain imperial_units
    arg = [x.split("=")[1] for x in sys.argv if "imperial_units" in x]
    #If the length is 0, no args were found, default to true
    #Otherwise use value after = and convert it to bool
    arg = True if len(arg) == 0 else bool(arg[0])
    log_to_pickle(arg)

我会使用argparse来处理这类事情。使用布尔标志参数。我也喜欢提供一个积极的和消极的版本,以便于使用

import argparse

...

if __name__ == "__main__":
    parser = argparse.ArgumentParser(prog='log-to-pickle')

    parser.add_argument('--imperial-units', dest='imperial_units', action='store_true')
    parser.add_argument('--no-imperial-units', dest='imperial_units', action='store_false')
    parser.set_defaults(imperial_units=True)

    args = parser.parse_args()

    log_to_pickle(args.imperial_units)

使用argparse,您也会收到一些很好的帮助消息:

$ python3 file.py -h
usage: log-to-pickle [-h] [--imperial-units] [--no-imperial-units]

optional arguments:
  -h, --help           show this help message and exit
  --imperial-units
  --no-imperial-units

现在,您可以这样调用应用程序:

# These are the same given the default.
$ python3 file.py
$ python3 file.py --imperial-units

或者做负片:

$ python3 file.py --no-imperial-units

如果您真的想为bool标志提供一个字符串参数,那么我将创建一个自定义方法来将字符串转换为布尔值:

import argparse


def bool_arg(val):
    return val.lower() in ('y', 'yes', 't', 'true', 'on', '1')


if __name__ == "__main__":
    parser = argparse.ArgumentParser(prog='log-to-pickle')

    parser.add_argument('--imperial-units', type=bool_arg, default=True)

    args = parser.parse_args()

    print(args.imperial_units)

示例:

$ python3 file.py --imperial-units y
True

$ python3 file.py --imperial-units True
True

$ python3 file.py --imperial-units 0
False

这里有一些错误,但根本原因是代码没有正确使用sys.argv。请尝试打印sys.argv

if __name__ == "__main__":
    import sys
    print(sys.argv)
$ python3 argv.py imperial_units=True
['argv.py', 'imperial_units=True']

您需要解析命令行参数

if __name__ == "__main__":
    if len(sys.argv) <= 1 or sys.argv[1] == "imperial_units=True":
        log_to_pickle(True)
    else:
        log_to_pickle(False)

查看^{}包以获得更健壮的命令行参数处理

相关问题 更多 >